PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak skopiować strukturę jednej tabeli do drugiej z ograniczeniami klucza obcego w psql?

Nie ma opcji automatycznego tworzenia kluczy obcych w CREATE TABLE ... LIKE ... .

dokumentacja:

W praktyce jest to łatwe dzięki narzędziom GUI. Na przykład w PgAdmin III:

  • Deklaracja kopii (DDL) source_table do narzędzia zapytania (ctrl-e),
  • edytuj deklarację,
  • wykonaj sql.

W skrypcie SQL możesz użyć następującej funkcji. Ważne założenie:klucze obce tabeli źródłowej mają poprawne nazwy, tzn. ich nazwy zawierają nazwę tabeli źródłowej (co jest typową sytuacją).

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 $$;

Przykład użycia:

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. Ukryte funkcje PostgreSQL

  2. Jak za pomocą psql wyświetlić listę rozszerzeń zainstalowanych w bazie danych?

  3. Transakcja JDBC z danymi wejściowymi użytkownika

  4. Jak stworzyć n-gram w postgresql

  5. Czy jest to błąd silnika SQL PostgreSQL i jak go uniknąć (obejście)?