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

Удаление данных с помощью внешнего ключа в таблице SQL Server

Я собираюсь удалить данные в таблице SQL Server (родительский), которая имеет отношение к другой таблице (дочерняя).
Я попробовал базовый запрос на удаление. Но он не работает (и я знаю, что этого не будет).

DELETE FROM table WHERE ...

Он вернул следующую ошибку

Оператор DELETE противоречит ограничению REFERENCE...

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

4b9b3361

Ответ 1

Вы можете отключить и снова включить ограничения внешнего ключа до и после удаления:

alter table MyOtherTable nocheck constraint all
delete from MyTable
alter table MyOtherTable check constraint all

Ответ 2

Вам нужно вручную удалить детей. <condition> для обоих запросов одинаково.

DELETE FROM child
FROM cTable AS child
INNER JOIN table AS parent ON child.ParentId = parent.ParentId
WHERE <condition>;

DELETE FROM parent
FROM table AS parent
WHERE <condition>;

Ответ 3

Если вы хотите, чтобы удаление было автоматическим, вам нужно изменить схему таким образом, чтобы ограничение внешнего ключа было ON DELETE CASCADE.

Для получения дополнительной информации см. страницу MSDN на каскадных ограничениях ссылочной целостности.

ETA (после уточнения с плаката): Если вы не можете обновить схему, вы должны вручную УДАЛИТЬ затронутые дочерние записи.

Ответ 4

здесь вы добавляете внешний ключ для своей таблицы "Ребенок"

ALTER TABLE child
ADD FOREIGN KEY (P_Id)
REFERENCES parent(P_Id) 
ON DELETE CASCADE
ON UPDATE CASCADE;

После этого, если вы сделаете запрос DELETE в таблице "Родительский", как этот

DELETE FROM parent WHERE .....

так как у ребенка есть ссылка на родителя с DELETE CASCADE, строки "Child" также будут удалены! наряду с "родителем".

Ответ 5

Итак, вам нужно DELETE связанные строки из конфликтуемых таблиц или более логично в UPDATE их столбце FOREIGN KEY для ссылки на другие PRIMARY KEY из родительской таблицы.

Кроме того, вы можете прочитать эту статью Dont Delete - Just Dont

Ответ 6

Чтобы удалить данные из таблиц, имеющих отношения parent_child, Сначала вы должны удалить данные из дочерней таблицы, указав объединение, а затем просто удалите данные из родительской таблицы, пример приведен ниже:

DELETE ChildTable
FROM ChildTable inner join ChildTable on PParentTable.ID=ChildTable.ParentTableID
WHERE <WHERE CONDITION> 


DELETE  ParentTable
WHERE <WHERE CONDITION>

Ответ 8

Полезный script, который вы можете удалить все данные во всех таблицах базы данных, замените tt на ваше имя базы данных:

declare @tablename nvarchar(100)
declare c1 cursor for
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG='tt' AND TABLE_TYPE='BASE TABLE'

open  c1
fetch next from c1 into @tablename

while @@FETCH_STATUS = 0
    begin
    print @t1
        exec('alter table ' + @tablename + ' nocheck constraint all')
        exec('delete from ' + @tablename)
        exec ('alter table ' + @tablename + ' check constraint all')
        fetch next from c1 into @tablename
    end
close c1
DEALLOCATE c1

Ответ 9

SET foreign_key_checks = 0; УДАЛИТЬ ИЗ ВАШЕГО ПЛАНА; SET foreign_key_checks = 1;