postgres не устанавливает внешний ключ в null при усечении - PullRequest
1 голос
/ 19 апреля 2020

Я пытаюсь усечь набор таблиц, но он продолжает жаловаться на внешний ключ. но этот внешний ключ установлен на on delete Set null

для воспроизведения:

create table test_players (id SERIAL PRIMARY KEY, name VARCHAR(255));
create table test_items (id SERIAL PRIMARY KEY, name VARCHAR(255), player_id INTEGER FOREIGN KEY (player_id) REFERENCES test_players(id) ON DELETE SET NULL);

теперь, если вы урежете test_players, он будет выдавать сообщение:

ERROR:  cannot truncate a table referenced in a foreign key constraint
DETAIL:  Table "test_items" references "test_players".
HINT:  Truncate table "test_items" at the same time, or use TRUNCATE ... CASCADE.
SQL state: 0A000

что я должен сделать, чтобы я мог удалить test_players без удаления test_items?

1 Ответ

0 голосов
/ 20 апреля 2020

Вы не можете делать то, что вы пытаетесь. Вам нужно будет сделать это в 3 шага.

  1. Обновите test_items и для каждого player_id. С технической точки зрения вам это не нужно, но если вы не задаете себе проблемы с целостностью данных.
  2. Перетащите test_items на test_players FK.
  3. Затем обрежьте test_players

Причина в том, что усечение в основном просто убирает таблицу, она НЕ обрабатывает отдельные строки. Поэтому он не будет обрабатывать FK с установленным нулем, он выдает ошибку, которую вы получили вместо этого. На самом деле, даже если дочерняя таблица пуста, или, если на то пошло, даже если родительская пуста. Смотрите скрипка здесь. Скрипка также содержит функцию для ее выполнения и тест для нее.

Конечно, вы можете просто удалить из test_players и позволить триггерам позаботиться об обновлении test_items. Занимает больше времени, особенно если стол больше, но вы сохраняете свой FK. Конечно, есть

Создайте свой FK заново.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...