No hay opción para crear claves foráneas automáticamente en CREATE TABLE ... LIKE ...
.
Para la documentación:
En la práctica, es fácil con herramientas GUI. Por ejemplo, en PgAdmin III:
- declaración de copia (DDL) de
source_table
a la herramienta de consulta (ctrl-e), - editar la declaración,
- ejecutar sql.
En un script SQL puede usar la siguiente función. Suposición importante:las claves externas de la tabla de origen tienen nombres correctos, es decir, sus nombres contienen el nombre de la tabla de origen (lo que es una situación típica).
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 $$;
Ejemplo de uso:
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)