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

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
29
задан Andha 24 November 2011 в 01:23
поделиться

9 ответов

Вам необходимо вручную удалить детей. <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>;
30
ответ дан Adam Wenger 24 November 2011 в 01:23
поделиться

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

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, строки «дочерний элемент» также будут удалены! вместе с «родителем».

9
ответ дан Sam T 24 November 2011 в 01:23
поделиться

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

0
ответ дан Amir Mofakhar 24 November 2011 в 01:23
поделиться

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

alter table MyOtherTable nocheck constraint all
delete from MyTable
alter table MyOtherTable check constraint all
37
ответ дан Chris Fulstow 24 November 2011 в 01:23
поделиться

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

Кроме того, вы можете прочитать эту статью Не удаляйте - просто не делайте

3
ответ дан Igor Borisenko 24 November 2011 в 01:23
поделиться

Просто установите 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 .

1
ответ дан Shaunlgs 24 November 2011 в 01:23
поделиться

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

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


DELETE  ParentTable
WHERE <WHERE CONDITION>
2
ответ дан Taryn 24 November 2011 в 01:23
поделиться

Полезный скрипт, который вы можете удалить все данные во всех таблицах базы данных, замените 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
0
ответ дан S.Mohamed Mahdi Ahmadian zadeh 24 November 2011 в 01:23
поделиться

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

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

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

18
ответ дан Alastair Maw 24 November 2011 в 01:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: