คัดลอกโครงสร้างตารางลงในตารางใหม่


95

มีวิธีคัดลอกโครงสร้างของตารางไปยังตารางใหม่โดยไม่มีข้อมูลรวมถึงคีย์และข้อ จำกัด ทั้งหมดหรือไม่


เลือก * เป็น NewTableName จาก OldTableName โดยที่ 1 = 2 stackoverflow.com/questions/2505728/…
Nityanand wachche

คำตอบ:


112

สำหรับสำเนาสคีมาอย่างง่ายให้ใช้ประโยค like

CREATE TABLE new_table_name ( like old_table_name including all)

13
คุณยังสามารถเพิ่มคอลัมน์ใหม่ได้เมื่อใช้ไวยากรณ์แบบนี้:CREATE TABLE new (like old, extra_column text);
Brad Koch

@BradKoch สามารถเพิ่มข้อ จำกัด พิเศษในคำสั่งนี้ได้หรือไม่? หรือควรแยกกัน?
Andrey Deineko

@AndreyDeineko ขึ้นอยู่กับตรวจสอบเอกสารสร้างตารางเพื่อดูรายละเอียดทั้งหมด คุณสามารถเพิ่มข้อ จำกัด การตรวจสอบและคีย์ต่างประเทศได้อย่างง่ายดายโดยใช้ไวยากรณ์นี้เช่นเดียวกับคำสั่งสร้างอื่น ๆ แต่ฉันไม่แน่ใจว่าสามารถใช้ข้อ จำกัด ระดับคอลัมน์เช่นไม่ว่างได้โดยไม่ต้องมีการเปลี่ยนแปลงในภายหลัง
Brad Koch

2
พยายามแล้ว ไม่ได้คัดลอกข้อ จำกัด และทริกเกอร์คีย์ต่างประเทศ (PostgreSQL 9.2)
Jānis Elmeris

76

สิ่งที่ใกล้เคียงที่สุดที่คุณจะได้รับจาก SQL คือ:

create table new (
    like old
    including defaults
    including constraints
    including indexes
);

แต่จะไม่คัดลอกทุกอย่าง สิ่งที่สำคัญที่สุดที่ขาดหายไปคือคีย์ต่างประเทศ นอกจากนี้ - ทริกเกอร์จะไม่ถูกคัดลอกด้วย ไม่แน่ใจเรื่องอื่น ๆ

อีกวิธีหนึ่งคือการถ่ายโอนข้อมูลโครงสร้างตารางเปลี่ยนชื่อในการถ่ายโอนข้อมูลและโหลดอีกครั้ง:

pg_dump -s -t old databases | sed 's/old/new/g' | psql

แต่ระวังว่า sed ที่เรียบง่ายดังกล่าวจะเปลี่ยนเก่าเป็นใหม่ในที่อื่นด้วย (เช่นถ้าคุณมีคอลัมน์ในตารางชื่อ "is_scolded" มันจะกลายเป็น "is_scnewed")

คำถามนั้นค่อนข้างจริง: ทำไมคุณถึงต้องการ - เพราะเพื่อจุดประสงค์ต่างๆฉันจะใช้เทคนิคที่แตกต่างกัน


หมายเหตุ: ใช้including constraintsไม่ได้กับ PostgreSQL 8.3
Ragnar123

1
ทำงานอย่างมีเสน่ห์ใน Postgres 9.3 :)
Ganapathy

15
คำตอบที่ดีที่สุด เพียงระวังว่าหากคุณมีค่า "อนุกรม" หรือคอลัมน์อื่น ๆ เริ่มต้นเป็นลำดับก็จะใช้ลำดับเดียวกันกับตารางเก่า! ดังนั้นหากคุณแทรกสิ่งต่างๆลงในตารางใดตารางหนึ่งมันจะเพิ่มขึ้นสำหรับทั้งคู่
sudo

22

ในการคัดลอกตารางอย่างสมบูรณ์สามารถใช้รูปแบบสั้น ๆ โดยใช้คำสั่ง TABLE ได้:

CREATE TABLE films2 AS
    TABLE films
    WITH NO DATA;

รายละเอียดเพิ่มเติมที่นี่


น่าเสียดายที่สิ่งนี้คัดลอกข้อมูลด้วยเช่นกัน - จากสิ่งที่ฉันเข้าใจคำถามคือเกี่ยวกับการคัดลอกสคีมาเท่านั้น
มิวทู

🙁เป็นโมฆะในตารางใหม่และไม่คัดลอกค่าเริ่มต้น
ilhan

10

ลองดูที่pgAdminเป็นวิธีที่ง่ายที่สุดในการทำสิ่งที่คุณต้องการ
คลิกขวาที่ตารางสคริปต์ - สร้าง


ฉันสามารถเข้าถึง phpPgAdmin เท่านั้น ฉันไม่ได้เป็นเจ้าของเซิร์ฟเวอร์
Alex S

พอใช้. ใน phpPgAdmin: ไปที่ตารางคลิกส่งออกเลือก "โครงสร้างเท่านั้น" และคุณมีสคริปต์ของคุณ
ChssPly76

ฉันค่อนข้างแน่ใจว่าพวกเขาต้องเป็นจุดบกพร่องในการติดตั้งนี้ - มันแสดงหน้าว่างในกรอบด้านขวาเมื่อฉันทำเช่นนั้น: /
Alex S

1
คุณลองทั้งตัวเลือก "แสดง" หรือ "ดาวน์โหลด" หรือไม่ หากทั้งสองไม่ได้ผลใช่อาจเป็นข้อบกพร่อง ถ้าใช่คุณจะต้องทำผ่าน SQL ดูที่ลิงค์ในคำตอบของ Dav
ChssPly76

ดาวน์โหลดเพียงแค่ให้ไฟล์ว่างเปล่า
Alex S

6

เกี่ยวกับ

CREATE TABLE sample_table_copy AS (SELECT * FROM sample_table WHERE 1 = 2)

postgresql.org คำตอบ


3
ขออภัยสิ่งนี้ไม่ได้เก็บรักษาคีย์ข้อ จำกัด หรือค่าเริ่มต้น
sudo

1
วิธีที่ดีกว่าในการแสดง 'WHERE 1 = 2' จะเป็น 'WHERE false' หรือไม่มีคำสั่ง WHERE เลย แต่ 'LIMIT 0' แทน
Kenyakorn Ketsombut
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.