Генерация скрипта, который отключает внешние ключи во многих таблицах

Полностью дикая догадка, но ваша конечная точка /api/AddEmployee не /AddEmployee?

попробуйте изменить

response = await httpClient.PostAsync("AddEmployee", content);

To

response = await httpClient.PostAsync("api/AddEmployee", content);
1
задан klin 24 January 2019 в 23:07
поделиться

1 ответ

Вам не нужно удалять и воссоздавать внешние ключи. Вместо этого используйте отложенные ограничения. Этого достаточно, когда вы определяете внешние ключи как deferrable initially deferred и выполняете все вставки в одной транзакции. Однако есть больше вариантов, поэтому читайте об отложенных ограничениях в документации:


Использовать системный каталог pg_constraint.

Вы можете сгенерировать скрипт для изменения внешних ключей на DEFERRABLE INITIALLY DEFERRED следующим образом:

select format(
    'ALTER TABLE %s ALTER CONSTRAINT %s DEFERRABLE INITIALLY DEFERRED;', 
    conrelid::regclass::text, 
    conname)
from pg_constraint
where contype = 'f' 
and conrelid = any(array['table1', 'table2', 'table3']::regclass[])
and connamespace = 'ssp2_pcat'::regnamespace;

Вы можете запустить скрипт один раз. Тогда ваш скрипт импорта может выглядеть так:

BEGIN;
TRUNCATE table1;
TRUNCATE table2;
...
INSERT INTO table1...
INSERT INTO table2...
...
COMMIT;

Если по какой-то причине вы не можете использовать отложенные ограничения, используйте сценарий для удаления ограничений:

select
    format(
        'ALTER TABLE %s DROP CONSTRAINT %s;', 
        conrelid::regclass::text, 
        conname)
from pg_constraint
where contype = 'f' 
and conrelid = any(array['table1', 'table2', 'table3']::regclass[])
and connamespace = 'ssp2_pcat'::regnamespace;

и для воссоздания их:

select
    format(
        'ALTER TABLE %s ADD CONSTRAINT %s %s;', 
        conrelid::regclass::text, 
        conname, 
        pg_get_constraintdef(oid))
from pg_constraint
where contype = 'f' 
and conrelid = any(array['table1', 'table2', 'table3']::regclass[])
and connamespace = 'ssp2_pcat'::regnamespace;
0
ответ дан klin 24 January 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: