2014-05-16 27 views

risposta

11

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

Per the documentation:

COME tabella_origine [like_option ...]

vincoli non nulli sono sempre copiate nella nuova tabella. CONTROLLARE vincoli verranno copiati solo se viene specificato VINCOLI inclusi [...]

indici, chiave primaria, e vincoli univoco nella tabella originale verranno creati nella nuova tabella solo se è specificata la clausola INDICI COMPRESI .

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

  • dichiarazione copia (DDL) di source_table per interrogare strumento (ctrl-e),
  • modificare 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, ad esempio i loro nomi contengono il nome della tabella di origine (che è 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) 
1

più Un modo è quello di scaricare la struttura della tabella, cambiare il suo nome in discarica, e caricarlo di nuovo:

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

La domanda è forse per creare un modulo Tavolo già esistente con lo stesso schema e vincoli forma sql. – Raghavan

+0

'pg_dump -s -t vecchi database' non conterrà i vincoli di chiave esterna –