dis
является вашим другом, если исходный код недоступен:
>>> import dis
>>> def foo(arg1,arg2):
... #do something with args
... a = arg1 + arg2
... return a
...
>>> dis.dis(foo)
3 0 LOAD_FAST 0 (arg1)
3 LOAD_FAST 1 (arg2)
6 BINARY_ADD
7 STORE_FAST 2 (a)
4 10 LOAD_FAST 2 (a)
13 RETURN_VALUE
Вам необходимо вручную удалить детей. <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>;
здесь вы добавляете внешний ключ для вашей «дочерней» таблицы
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, строки «дочерний элемент» также будут удалены! вместе с «родителем».
SET foreign_key_checks = 0; УДАЛИТЬ ИЗ ВАШЕГО ПЛАНА; SET foreign_key_checks = 1;
Вы можете отключить и снова включить ограничения внешнего ключа до и после удаления:
alter table MyOtherTable nocheck constraint all
delete from MyTable
alter table MyOtherTable check constraint all
Итак, вам нужно DELETE
связать строки из конфликтующих таблиц или более логично UPDATE
их столбец FOREIGN KEY
для ссылки на другие PRIMARY KEY
из родительской таблицы.
Кроме того, вы можете прочитать эту статью Не удаляйте - просто не делайте
Просто установите 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 .
Чтобы удалить данные из таблиц, имеющих отношение parent_child, сначала необходимо удалить данные из дочерней таблицы, упомянув join, а затем просто удалить данные из родительской таблицы, пример приведен ниже:
DELETE ChildTable
FROM ChildTable inner join ChildTable on PParentTable.ID=ChildTable.ParentTableID
WHERE <WHERE CONDITION>
DELETE ParentTable
WHERE <WHERE CONDITION>
Полезный скрипт, который вы можете удалить все данные во всех таблицах базы данных, замените 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
Если вы хотите, чтобы удаление было автоматическим, вам нужно изменить схему так, чтобы ограничение внешнего ключа было ON DELETE CASCADE
.
Для получения дополнительной информации см. Страницу MSDN по каскадным ограничениям ссылочной целостности .
ETA (после пояснения от автора): если вы не можете обновить схему, сначала необходимо УДАЛИТЬ вручную затронутые дочерние записи.