Sao chép cấu trúc bảng vào bảng mới


91

Có cách nào để sao chép cấu trúc của một bảng vào một bảng mới, không có dữ liệu, bao gồm tất cả các khóa và ràng buộc không?

Câu trả lời:


106

Đối với một bản sao giản đồ đơn giản, hãy sử dụng mệnh đề like.

CREATE TABLE new_table_name ( like old_table_name including all)

13
Đáng chú ý bạn cũng có thể thêm các cột mới khi sử dụng những thứ tương tự cú pháp:CREATE TABLE new (like old, extra_column text);
Brad Koch

@BradKoch có thể thêm các ràng buộc bổ sung trong câu lệnh này không? Hay nó phải là một cái riêng biệt?
Andrey Deineko,

@AndreyDeineko Tùy thuộc vào, hãy kiểm tra tài liệu tạo bảng để biết đầy đủ chi tiết. Bạn có thể dễ dàng thêm các ràng buộc kiểm tra và khóa ngoại bằng cú pháp này, giống như với bất kỳ câu lệnh tạo nào khác, nhưng tôi không chắc liệu các ràng buộc cấp cột như not null có thể được áp dụng mà không có thay đổi tiếp theo hay không.
Brad Koch,

2
Vừa mới thử. Không sao chép các ràng buộc và trình kích hoạt khóa ngoại (PostgreSQL 9.2).
Jānis Elmeris 19/09/19

73

Chà, cách gần nhất bạn có thể nhận được với SQL là:

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

Nhưng nó sẽ không sao chép mọi thứ. Những thứ quan trọng nhất bị thiếu là CHÌA KHÓA NGOẠI TỆ. Ngoài ra - các trình kích hoạt cũng không được sao chép. Không chắc về những thứ khác.

Một cách khác là kết xuất cấu trúc bảng, thay đổi tên của nó trong kết xuất và tải lại:

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

Nhưng hãy cẩn thận, rằng sed đơn giản như vậy cũng sẽ thay đổi cũ thành mới ở những nơi khác (ví dụ: nếu bạn có trong cột bảng của mình có tên "is_scolded", nó sẽ trở thành "is_scnewed").

Câu hỏi thực sự là: tại sao bạn cần nó - bởi vì cho các mục đích khác nhau, tôi sẽ sử dụng các kỹ thuật khác nhau.


Lưu ý: including constraintskhông hoạt động trên PostgreSQL 8.3
Ragnar123

1
Làm việc như một sự quyến rũ trong Postgres 9.3 :)
Ganapathy

14
Câu trả lời tốt nhất. Chỉ cần lưu ý rằng nếu bạn có giá trị "nối tiếp" hoặc một số cột khác được mặc định thành một chuỗi, nó sẽ sử dụng cùng một chuỗi như bảng cũ! Vì vậy, nếu bạn chèn nội dung vào một trong hai bảng, nó sẽ tăng lên cho cả hai.
sudo

19

Để sao chép hoàn toàn một bảng, bạn cũng có thể sử dụng biểu mẫu rút gọn bằng lệnh TABLE:

CREATE TABLE films2 AS
    TABLE films
    WITH NO DATA;

Thêm chi tiết tại đây


Đáng tiếc là bản này các dữ liệu cũng - từ những gì tôi hiểu câu hỏi là về việc sao chép chỉ là schema
Jasmine

Id 🙁 là NULL trong bảng mới và không sao chép các giá trị mặc định.
ilhan

10

Hãy xem pgAdmin - cho đến nay là cách dễ nhất để làm những gì bạn muốn.
Nhấp chuột phải vào bảng, Tập lệnh - Tạo.


Tôi chỉ có quyền truy cập vào phpPgAdmin; Tôi không sở hữu máy chủ.
Alex S

Đủ công bằng. Trong phpPgAdmin: điều hướng để bàn, nhấp vào Export, chọn "Cấu trúc Chỉ" và bạn có kịch bản của bạn
ChssPly76

Tôi khá chắc chắn họ phải là một lỗi trong cài đặt này - nó chỉ cho thấy một trang trống trong khung bên phải khi tôi làm điều đó: /
Alex S

1
Bạn đã thử cả hai tùy chọn "hiển thị" hoặc "tải xuống"? Nếu cả hai đều không hoạt động thì có, đó có thể là một lỗi. Nếu vậy, bạn sẽ cần phải làm điều đó qua SQL, hãy xem liên kết trong câu trả lời của Dav.
ChssPly76

Tải xuống chỉ mang lại cho tôi một tệp trống.
Alex S

6

Làm thế nào về

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

câu trả lời postgresql.org


3
Thật không may, điều này không bảo toàn các khóa, ràng buộc hoặc mặc định.
sudo

1
Cách tốt hơn để diễn đạt 'WHERE 1 = 2' sẽ là 'WHERE false' hoặc không có mệnh đề WHERE nào cả, mà thay vào đó là 'LIMIT 0'.
Kenyakorn Ketsombut
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.