PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm thế nào để sao chép cấu trúc của bảng này sang bảng khác với các ràng buộc khóa ngoại trong psql?

Không có tùy chọn để tự động tạo khóa ngoại trong CREATE TABLE ... LIKE ... .

Đối với tài liệu:

Trong thực tế, thật dễ dàng với các công cụ GUI. Ví dụ:trong PgAdmin III:

  • sao chép khai báo (DDL) của source_table sang công cụ truy vấn (ctrl-e),
  • chỉnh sửa tuyên bố,
  • thực thi sql.

Trong một tập lệnh SQL, bạn có thể sử dụng hàm sau. Giả định quan trọng:các khóa ngoại của bảng nguồn có tên chính xác, tức là tên của chúng chứa tên bảng nguồn (tình huống điển hình là gì).

create or replace function create_table_like(source_table text, new_table text)
returns void language plpgsql
as $$
declare
    rec record;
begin
    execute format(
        'create table %s (like %s including all)',
        new_table, source_table);
    for rec in
        select oid, conname
        from pg_constraint
        where contype = 'f' 
        and conrelid = source_table::regclass
    loop
        execute format(
            'alter table %s add constraint %s %s',
            new_table,
            replace(rec.conname, source_table, new_table),
            pg_get_constraintdef(rec.oid));
    end loop;
end $$;

Ví dụ sử dụng:

create table base_table (base_id int primary key);
create table source_table (id int primary key, base_id int references base_table);

select create_table_like('source_table', 'new_table');

\d new_table

   Table "public.new_table"
 Column  |  Type   | Modifiers 
---------+---------+-----------
 id      | integer | not null
 base_id | integer | 
Indexes:
    "new_table_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
    "new_table_base_id_fkey" FOREIGN KEY (base_id) REFERENCES base_table(base_id)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Loại bỏ dấu ngoặc kép với SQLalchemy cho PostgreSQL

  2. Chèn cột json của Postgres bằng wildfly

  3. Mẫu bảng và các phương pháp khác để lấy các bộ số ngẫu nhiên

  4. Lưu trữ PostgreSQL ARRAY của các giá trị ENUM

  5. HikariCP - kết nối không khả dụng