PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come copiare la struttura di una tabella in un'altra con vincoli di chiave esterna in psql?

Non c'è alcuna opzione per creare automaticamente chiavi esterne in CREATE TABLE ... LIKE ... .

Per la documentazione:

In pratica è facile con gli strumenti della GUI. Ad esempio, in PgAdmin III:

  • dichiarazione di copia (DDL) di source_table per eseguire query (ctrl-e),
  • modifica la dichiarazione,
  • esegui sql.

In uno script SQL è possibile utilizzare la seguente funzione. Presupposto importante:le chiavi esterne della tabella di origine hanno nomi corretti, ovvero i loro nomi contengono il nome della tabella di origine (qual è una situazione tipica).

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

Esempio di utilizzo:

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)