Я получил ошибку "Операция DELETE противоречила ограничению REFERENCE"
Я попытался обрезать таблицу с помощью внешних ключей и получил сообщение:
" Невозможно обрезать таблицу, потому что на нее ссылается ограничение 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)
он не дает ошибки и работает правильно. Я хочу удалить всю информацию из таблицы и добавить в нее новую, но я не хочу удалять и создавать внешние ключи.
Ответы
Ответ 1
Ошибка означает, что у вас есть данные в других таблицах, которые ссылаются на данные, которые вы пытаетесь удалить.
Вам нужно будет либо сбросить, либо воссоздать ограничения, либо удалить данные, которые ссылаются на внешний ключ.
Предположим, что у вас есть следующие таблицы
dbo.Students
(
StudentId
StudentName
StudentTypeId
)
dbo.StudentTypes
(
StudentTypeId
StudentType
)
Предположим, что существует ограничение внешнего ключа между столбцом StudentTypeId
в StudentTypes
и столбцом StudentTypeId
в Students
Если вы попытаетесь удалить все данные в StudentTypes
, в столбце StudentTypeId
в Students
появится сообщение об ошибке в таблице StudentTypes
.
EDIT:
DELETE
и TRUNCATE
по существу делают то же самое. Единственное отличие состоит в том, что TRUNCATE
не сохраняет изменения в файле журнала. Также вы не можете использовать предложение WHERE
с TRUNCATE
КАК, почему вы можете запускать это в SSMS, но не через свое приложение. Я действительно не вижу этого. Ограничение FK все равно выдаст ошибку, независимо от того, откуда произошла транзакция.
Ответ 2
Рассматривали ли вы применение ON DELETE CASCADE
, если это необходимо?
Ответ 3
Вы пытаетесь удалить строку, на которую ссылается другая строка (возможно, в другой таблице).
Вам нужно сначала удалить эту строку (или, по крайней мере, повторно установить свой внешний ключ на что-то еще), иначе вы получите строку, ссылающуюся на несуществующую строку. База данных запрещает это.
Ответ 4
Чтобы УДАЛИТЬ, не изменяя ссылки, вы должны сначала удалить или иным образом изменить (в соответствии с вашими целями) все соответствующие строки в других таблицах.
В TRUNCATE вы должны удалить ссылки. TRUNCATE - это оператор DDL (сравнимый с CREATE и DROP), а не оператор DML (например, INSERT и DELETE) и не вызывает срабатывания триггеров, будь то явные или связанные с ссылками и другими ограничениями. Из-за этого база данных может быть переведена в несогласованное состояние, если TRUNCATE разрешено в таблицах со ссылками. Это было правилом, когда TRUNCATE являлся расширением стандарта, используемого некоторыми системами, и теперь он утвержден стандартом, теперь он добавлен.