Postgres: DELETE висит на таблице с самореференционным внешним ключом - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь удалить строки из таблицы, которая имеет внешний ключ, ссылающийся на себя:

CREATE TABLE items (
    id        SERIAL  PRIMARY KEY,
    parent_id INTEGER      NOT NULL,
    FOREIGN KEY (parent_id) REFERENCES refers(id)
);

Теперь, когда я просто делаю:

DELETE FROM items;

запрос зависает навсегда. Если я убью его с помощью Ctrl- C, он скажет:

ОШИБКА: отмена оператора из-за запроса пользователя КОНТЕКСТ: SQL оператор "ТОЛЬКО ОБНОВЛЕНИЕ" publi c "." Items "SET "parent" = NULL WHERE $ 1 OPERATOR (pg_catalog. =) "parent" "

Как удалить строки из такой таблицы?

1 Ответ

0 голосов
/ 18 июня 2020

Согласно этот ответ , внешние ключи в Postgres реализованы как триггеры, поэтому вы можете временно отключить проверки внешнего ключа следующим образом:

ALTER TABLE items DISABLE TRIGGER ALL; 
DELETE FROM items; 
ALTER TABLE items ENABLE TRIGGER ALL;
...