Подтвердить что ты не робот

Я получил ошибку "Операция 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)

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

4b9b3361

Ответ 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 являлся расширением стандарта, используемого некоторыми системами, и теперь он утвержден стандартом, теперь он добавлен.