sql >> Database >  >> RDS >> PostgreSQL

Hoe de structuur van de ene tabel naar de andere te kopiëren met externe sleutelbeperkingen in psql?

Er is geen optie om automatisch externe sleutels aan te maken in CREATE TABLE ... LIKE ... .

Voor de documentatie:

In de praktijk is het eenvoudig met GUI-tools. Bijvoorbeeld in PgAdmin III:

  • kopie aangifte (DDL) van source_table naar zoekhulpmiddel (ctrl-e),
  • bewerk de aangifte,
  • voer sql uit.

In een SQL-script kun je de volgende functie gebruiken. Belangrijke aanname:externe sleutels van de brontabel hebben de juiste namen, d.w.z. hun namen bevatten de naam van de brontabel (wat een typische situatie is).

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

Gebruiksvoorbeeld:

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. PHP MySQL-paginering met willekeurige volgorde

  2. Tabel samenvoegen in MySQL

  3. Is het gebruik van Dev/Test RDS een slecht idee voor uw project boven Production RDS?

  4. Left Outer Join retourneert niet alle records uit de primaire tabel