Невозможно усечь таблицу, потому что на нее ссылается ограничение FOREIGN KEY - PullRequest
7 голосов
/ 05 марта 2012

Я получаю следующее сообщение, даже когда таблица, ссылающаяся на нее, пуста: «Невозможно усечь таблицу« dbo.Link », так как на нее ссылается ограничение FOREIGN KEY» Кажется, не имеет особого смысла, почему это происходит , Есть предложения?

Ответы [ 5 ]

12 голосов
/ 05 марта 2012

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

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

4 голосов
/ 18 августа 2014

Вы не можете обрезать таблицу с ограничением FK. В качестве обходного пути вы могли бы: 1 / Снять ограничения 2 / усечь стол 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
3 голосов
/ 05 марта 2012

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

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

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

1 голос
/ 02 ноября 2012

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

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

0 голосов
/ 09 ноября 2015

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

SET FOREIGN_KEY_CHECKS=0;

Затем обрежьте ваши таблицы

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

SET FOREIGN_KEY_CHECKS=1;

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

...