обновление или удаление в таблице «сотрудник» нарушает ограничение внешнего ключа - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть таблица employee со следующими столбцами:

fname (varchar), lname (varchar), id (numeric)  

id - это первичный ключ.

Существует имя таблицы с именем works_on со столбцами

projectname (varchar), id (numeric)  

Здесь id - это внешний ключ, который ссылается на таблицу employee.

Когда я пытался удалить строку из таблицы employee следующим образом:

delete from employee where id = 1

Я получаю эту ошибку:

обновление или удаление в таблице "employee" нарушает ограничение внешнего ключа "works_on_id_fkey" для таблицы "works_on" `.

Я новичок в системе управления базами данных.

Есть решение?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

В качестве сотрудника используется внешний ключ в таблице works_on;причина, по которой вы не можете удалить идентификатор сотрудника 1, заключается в том, что идентификатор сотрудника 1 существует в works_on (или, возможно, в других таблицах, в которых сотрудник является внешним ключом).Система пытается сохранить целостность базы данных, предотвращая удаление сотрудника, связанного с works_on.

Скажем, система позволяет удалить запись сотрудника.Теперь, когда вы посмотрите на таблицу works_on, к чему относится сотрудник 1?Вы больше не можете искать имена / фамилии среди другой информации.Таким образом, система говорит: если вы хотите удалить запись сотрудника, вы должны сначала удалить / изменить связи внешних ключей с другими системными записями;обеспечить их постоянную целостность.Если система позволит вам сделать это, она будет называться «Сиротами».родительская запись, с которой ассоциируется дочерний элемент, больше не существует.

Чтобы разрешить несколько вариантов:

  • Создайте процедуру, которая удаляет сотрудников, но сначала проверяет все таблицы, в которых сотрудник являетсявнешний ключ и гарантирует, что их можно удалить;а затем удаляет эти записи перед удалением записи сотрудника.(это может вызвать массивную цепочку, если у этих таблиц есть PK, для которых другие таблицы являются FK. Но это характер СУБД.
  • Создайте функцию, которая позволяет назначать такие записи для замены сотрудника 1 или удаляет такие записиесли больше не имеет значения.
  • enable ON DELETE CASCADE ON UPDATE CASCADE,, который автоматически удалит дочерние записи, если родительская запись удалена. (БУДЬТЕ ОЧЕНЬ ОСТОРОЖНЫ И УЧИТЫВАЙТЕ, как это повлияет на вашу систему перед включением) Пример: Документы
  • Не удаляйте запись, вместо этого сохраняйте поле состояния, показывающее активный / неактивный, и используйте его в качестве механизма контроля, чтобы показать или не показать сотрудников и связанные с ними записи.
  • Есть также несколько других вариантов: вы должны спросить себя или компанию, для которой это разрабатывается, что должно произойти со всеми теми записями, в которых сотрудник 1 является внешним ключом. Удалить некоторые / Все, переназначить некоторые удалитьНекоторые? Подскажите пользователю, как они хотят обрабатывать каждый экземпляр? Просто сообщитеПользователь должен сначала обратиться к найденным ограничениям (перечислить все места, где этот сотрудник имеет отношение к FK?) и убедиться, что у них есть способ обработать все эти места ... Множество вариантов.
0 голосов
/ 30 сентября 2018

Вы не можете удалить строку таким способом.Потому что в нем есть идентификатор ограничения (works_on_id_fkey).Если вы хотите удалить, вы должны удалить ограничение из него.

alter table employee drop foreign key works_on_id_fkey
...