Я получил ошибку "Оператор DELETE конфликтует с ограничением REFERENCE" - PullRequest
47 голосов
/ 23 сентября 2010

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

" Невозможно усечь таблицу, поскольку на нее ссылается ограничение FOREIGN KEY ".

Я прочитал много литературы о проблеме и подумал, что нашел решение, используя delete

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)

Но я все еще получил сообщение об ошибке:

" Оператор DELETE конфликтует с ограничением REFERENCE ".

Когда я пытаюсь удалить с помощью Microsoft Management Studio и выполнить предыдущий запрос

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)

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

Ответы [ 4 ]

46 голосов
/ 23 сентября 2010

Ошибка означает, что у вас есть данные в других таблицах, которые ссылаются на данные, которые вы пытаетесь удалить.

Вам потребуется либо удалить и заново создать ограничения, либо удалить данные, на которые ссылается внешний ключ.

Предположим, у вас есть следующие таблицы

dbo.Students
(
StudentId
StudentName
StudentTypeId
)


dbo.StudentTypes
(
StudentTypeId
StudentType
)

Предположим, существует ограничение внешнего ключа между столбцом StudentTypeId в StudentTypes и столбцом StudentTypeId в Students

Если вы попытаетесь удалить все данные в StudentTypes, произойдет ошибка, поскольку столбец StudentTypeId в Students ссылается на данные в таблице StudentTypes.

РЕДАКТИРОВАТЬ:

DELETE и TRUNCATE по сути делают одно и то же.Единственное отличие состоит в том, что TRUNCATE не сохраняет изменения в файле журнала.Также вы не можете использовать предложение WHERE с TRUNCATE

AS, почему вы можете запускать это в SSMS, но не через свое приложение.Я действительно не могу видеть, что это происходит.Ограничение FK будет по-прежнему выдавать ошибку независимо от того, откуда произошла транзакция.

12 голосов
/ 23 сентября 2010

Рассматривали ли вы применение ON DELETE CASCADE в соответствующих случаях?

7 голосов
/ 23 сентября 2010

Вы пытаетесь удалить строку, на которую ссылается другая строка (возможно, в другой таблице).

Вам необходимо удалить эту строку в первую очередь (или хотя бы сбросить еевнешний ключ к чему-то еще), иначе вы бы получили строку, которая ссылается на несуществующую строку.База данных запрещает это.

1 голос
/ 23 сентября 2010

Чтобы УДАЛИТЬ, не изменяя ссылки, вы должны сначала удалить или иным образом изменить (способом, подходящим для ваших целей) все соответствующие строки в других таблицах.

Для TRUNCATE вы должны удалить ссылки.TRUNCATE является оператором DDL (сравнимым с CREATE и DROP), а не оператором DML (например, INSERT и DELETE) и не вызывает срабатывания триггеров, явных или связанных со ссылками и другими ограничениями.Из-за этого база данных может быть переведена в несогласованное состояние, если TRUNCATE был разрешен для таблиц со ссылками.Это было правилом, когда TRUNCATE был расширением стандарта, используемого некоторыми системами, и теперь этот стандарт является обязательным для стандарта, когда он был добавлен.

...