Làm thế nào để TẠO BẢNG THÍCH THÍCH mà không bị ràng buộc KHÔNG NULL?


9

Tôi đang cố gắng tạo lại cấu trúc của bảng bên trong hàm bằng cách sử dụng một số SQL động.

EXECUTE 'CREATE TABLE ' || my_table_name || '_bk' ||
    ' (like ' || _my_table_name || ')';

Điều đó sẽ tương tự như:

CREATE TABLE my_table_bk
(like my_table);

Nhưng tôi cần loại bỏ tất cả các ràng buộc. Sử dụng EXCLUDING CONSTRAINTStrong Tùy chọn Thích , nó vẫn sao chép các ràng buộc KHÔNG NULL (Tài liệu xác nhận hành vi này):

CREATE TABLE my_table_bk
(like my_table EXCLUDING CONSTRAINTS);

Câu hỏi là, làm thế nào tôi có thể tạo lại cấu trúc bảng mà không bị ràng buộc KHÔNG NULL, hoặc, thay vào đó, loại bỏ tất cả các ràng buộc KHÔNG NULL trong một bảng?

Câu trả lời:


6

Điều này đã được hỏi về Stack Overflow trong Cách loại bỏ tất cả các ràng buộc KHÔNG NULL từ bảng PostgreQuery trong một lần . Nó xuất hiện để cung cấp một loạt các giải pháp tốt.

Các câu trả lời được chấp nhận bởi Denis de Bernardy là:

Bạn có thể nhóm tất cả chúng trong cùng một câu lệnh thay đổi:

   alter table tbl alter col1 drop not null,
                   alter col2 drop not null,
                   

Bạn cũng có thể truy xuất danh sách các cột có liên quan từ danh mục, nếu bạn cảm thấy muốn viết một khối do để tạo SQL cần thiết. Chẳng hạn, một cái gì đó như:

select a.attname
  from pg_catalog.pg_attribute a
 where attrelid = 'tbl'::regclass
   and a.attnum > 0
   and not a.attisdropped
   and a.attnotnull;

(Lưu ý rằng điều này cũng sẽ bao gồm các trường liên quan đến khóa chính, vì vậy bạn sẽ muốn lọc chúng ra.)

Nếu bạn làm điều này, đừng quên sử dụng quote_ident()trong trường hợp bạn cần xử lý các ký tự có khả năng kỳ lạ trong tên cột.


13

Thử cái này:

CREATE TABLE my_table_bk
AS
  SELECT *
  FROM my_table
  WHERE false;

Hoặc, bạn có thể nối thêm LIMIT 0thay vì WHEREmệnh đề.

Điều này sẽ tạo ra một bảng my_table_bkcó cấu trúc giống như my_tablekhông có ràng buộc và không có dữ liệu.


0

Cập nhật: phương pháp này tốt hơn nếu bạn muốn sao chép cấu trúc bảng mà không bị ràng buộc

Tôi nghĩ rằng cách dễ nhất để tạo một bảng như không có NOT NULLràng buộc, là sử dụng một cách đơn giản pg_dumpsed

pg_dump -Ox --schema-only -t myTable myDatabase |
  sed -ne'/^CREATE TABLE/,/);/p' -e's/^NOT NULL//';

Bạn có thể dễ dàng mở rộng phương pháp này để loại bỏ phần còn lại của các ràng buộc. Thuật ngữ này khá rộng, vì vậy tôi không chắc những hạn chế nào bạn không muốn.

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.