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

Я получаю следующее сообщение, даже если таблица, которая ссылается на него, пуста: "не удается усечь таблицу 'dbo.Ссылка "потому что на нее ссылается ограничение внешнего ключа", похоже, не имеет большого смысла, почему это происходит. Есть предложения?

5 ответов


в SQL Server таблица, на которую ссылается FK, в настоящее время не может быть усечена, даже если все таблицы ссылок пусты или внешние ключи отключены.

вам нужно использовать DELETE (может потребоваться гораздо больше ведения журнала) или отбросить отношения (ы) до использования TRUNCATE и воссоздать их впоследствии или увидеть обходные пути на этот пункт Connect для способа достижения этого с помощью ALTER TABLE ... SWITCH


вы не можете усечь таблицу, на которой есть ограничение FK. Как обходной путь, вы могли бы: 1 / снять ограничения 2 / Trunc таблица 3/ воссоздать ограничений.

вот это связанный скрипт T-SQL, предположим, у вас есть 2 таблицы с именем таблица mytable и MyReferencedTable:

-- Remove constraint
IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_MyReferencedTable_MyTable')
BEGIN
    ALTER TABLE dbo.MyReferencedTable
    DROP CONSTRAINT FK_MyReferencedTable_MyTable
END


-- Truncate table
TRUNCATE TABLE dbo.MyTable


-- Re-Add constraint
IF NOT EXISTS(SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_MyReferencedTable_MyTable')
BEGIN
    ALTER TABLE dbo.MyReferencedTable
    WITH CHECK ADD CONSTRAINT [FK_MyReferencedTable_MyTable] FOREIGN KEY(ListingKey)
    REFERENCES dbo.MyTable (ListingKey)
END

выполните следующий запрос для поиска каких-либо ограничений:

use MyDatabase
select c.name as c_name, t.name as t_name
from sys.key_constraints c
join sys.tables t on t.object_id = c.parent_object_id

если какое-либо ограничение найдено на вашей таблице, удалите его.


Если вы получили эту ошибку и вы должны усечь таблицу, то альтернативным решением может быть то, что вы можете удалить и повторно создать таблицу вместе с
primary/other_keys/indexes/triggers. Пожалуйста, убедитесь, что вам не нужны данные в этой таблице.

Это решение работает как шарм для меня и вряд ли за минуту до конца. Я делаю это для маскировки.


вместо удаления или воссоздания ограничения я предпочитаю этот более простой способ. Отключите проверку ограничений, выполнив сначала следующий запрос:

SET FOREIGN_KEY_CHECKS=0;

затем усечь таблицы

и, наконец, повторно активируйте проверку ограничений:

SET FOREIGN_KEY_CHECKS=1;

Это распространенное решение при переносе баз данных, поэтому вам не нужно беспокоиться о порядке вставки таблиц.