Torakami Ответов: 1

Как найти правильные данные последовательности и удалить в этом порядке из таблицы кто имеет отношение внешнего ключа


У меня есть одна таблица под названием product.

нет, есть почти 23 таблицы, которые имеют внешние ключи по отношению к первичному ключу таблиц продуктов. т. е. productId

теперь эти 23 таблицы также имеют несколько связей с другими таблицами .

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

У меня ДНТ есть какой-нибудь на delete cascade

Что я уже пробовал:

begin transaction;

   declare @deletedIds table ( productId int );

   insert into @deletedIds
   select p.productId from Product as p 
   where p.ProductID = 131
   
   delete cl 
   from CallOrder as cl
   join @deletedIds as d
   on d.productId = cl.ProductID

   delete cl 
   from CallSample as cl
   join @deletedIds as d
   on d.productId = cl.ProductID



   commit transaction;


теперь проблема в том, что дочерние таблицы alos имеют связь с другой таблицей, поэтому я не могу удалить записи из всех этих таблиц .

1 Ответов

Рейтинг:
1

Wendelius

Лично я действительно не стал бы делать это с помощью команд на стороне клиента. Вместо этого я бы изменил типы внешних ключей на delete CASCADE, если логика такова, что при удалении продукта удаляются и дочерние элементы.

Если вам нужно выполнить дополнительные проверки того, может ли строка быть удалена или нет, например, на основе состояния или аналогичного, то используйте триггеры для выполнения этих проверок и предотвращения удаления нежелательных строк.

Если вы все еще хотите удалить их с помощью программы, одним из способов может быть рекурсивная проверка внешних ключей использования, например sp_fkeys (Transact-SQL)[^].

Однако, поскольку условия меняются и Ключевые значения меняются, вы должны принять все это во внимание при обходе дерева. Если ваша программа динамически не создает таблицы, я считаю, что проще писать статические запросы для удаления. В конце концов, вы, вероятно, знаете все таблицы, которые могут быть дочерними элементами продукта.


Torakami

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

Wendelius

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