sql >> Databáze >  >> RDS >> PostgreSQL

Jak zkopírovat strukturu jedné tabulky do druhé s omezením cizího klíče v psql?

V CREATE TABLE ... LIKE ... není možnost automatického vytváření cizích klíčů .

Pro dokumentaci:

V praxi je to snadné s nástroji GUI. Například v PgAdmin III:

  • zkopírujte deklaraci (DDL) source_table na dotazovací nástroj (ctrl-e),
  • upravit prohlášení,
  • spustit sql.

Ve skriptu SQL můžete použít následující funkci. Důležitý předpoklad:cizí klíče zdrojové tabulky mají správná jména, tj. jejich názvy obsahují název zdrojové tabulky (což je typická situace).

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

Příklad použití:

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. Pochopení vstupního výstupního systému Hadoop

  2. Připojit MySQL k MATLABu?

  3. postgres pouze pomocí tříděného indexu pro dotazování tabulky 5m záznamů

  4. Příklad háčku filtru pro aktualizaci položky se souvisejícím polem