Ответ 1
Вы можете отключить и снова включить ограничения внешнего ключа до и после удаления:
alter table MyOtherTable nocheck constraint all
delete from MyTable
alter table MyOtherTable check constraint all
Я собираюсь удалить данные в таблице SQL Server (родительский), которая имеет отношение к другой таблице (дочерняя).
Я попробовал базовый запрос на удаление. Но он не работает (и я знаю, что этого не будет).
DELETE FROM table WHERE ...
Он вернул следующую ошибку
Оператор DELETE противоречит ограничению REFERENCE...
Мне нужно сохранить схему таблицы. Я знаю, что мне просто нужно добавить несколько слов в запрос, я когда-либо делал это раньше, но я просто не мог его вспомнить.
Вы можете отключить и снова включить ограничения внешнего ключа до и после удаления:
alter table MyOtherTable nocheck constraint all
delete from MyTable
alter table MyOtherTable check constraint all
Вам нужно вручную удалить детей. <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>;
Если вы хотите, чтобы удаление было автоматическим, вам нужно изменить схему таким образом, чтобы ограничение внешнего ключа было ON DELETE CASCADE
.
Для получения дополнительной информации см. страницу MSDN на каскадных ограничениях ссылочной целостности.
ETA (после уточнения с плаката): Если вы не можете обновить схему, вы должны вручную УДАЛИТЬ затронутые дочерние записи.
здесь вы добавляете внешний ключ для своей таблицы "Ребенок"
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" также будут удалены! наряду с "родителем".
Итак, вам нужно DELETE
связанные строки из конфликтуемых таблиц или более логично в UPDATE
их столбце FOREIGN KEY
для ссылки на другие PRIMARY KEY
из родительской таблицы.
Кроме того, вы можете прочитать эту статью Dont Delete - Just Dont
Чтобы удалить данные из таблиц, имеющих отношения parent_child, Сначала вы должны удалить данные из дочерней таблицы, указав объединение, а затем просто удалите данные из родительской таблицы, пример приведен ниже:
DELETE ChildTable
FROM ChildTable inner join ChildTable on PParentTable.ID=ChildTable.ParentTableID
WHERE <WHERE CONDITION>
DELETE ParentTable
WHERE <WHERE CONDITION>
Установите FOREIGN_KEY_CHECKS до и после удаления операторов SQL.
SET FOREIGN_KEY_CHECKS = 0;
DELETE FROM table WHERE ...
DELETE FROM table WHERE ...
DELETE FROM table WHERE ...
SET FOREIGN_KEY_CHECKS = 1;
Источник: https://alvinalexander.com/blog/post/mysql/drop-mysql-tables-in-any-order-foreign-keys.
Полезный 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
SET foreign_key_checks = 0; УДАЛИТЬ ИЗ ВАШЕГО ПЛАНА; SET foreign_key_checks = 1;