Удалить / усечь записи в таблице, которая имеет внешние ключи - PullRequest
0 голосов
/ 12 февраля 2012

Это мое требование, я пытаюсь уточнить это с точки зрения базы данных Adventure works.

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

SELECT * INTO Product_temp
FROM [AdventureWorks].[Production].[Product]

Поэтому мне нужно удалить все записи из таблицы Product, а затем вставить из product_temp .

Я нашел этот ответ, но не могу найти эту опцию в SQL SERVER 2005

Каскадное удаление SQL Server 2005

Ответы [ 2 ]

1 голос
/ 26 мая 2017

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

  1. Запустить запрос на удаление. Затем

2.EXEC sp_MSforeachtable 'UPDATE STATISTICS?WITH FULLSCAN '

3.Exec sp_MSforeachtable "dbcc dbreindex ('? ')"

1 голос
/ 13 февраля 2012

Если вы в состоянии сделать оптовую замену всех четырех таблиц, то ваша самая быстрая стратегия состоит в том, чтобы удалить все строки из всех четырех таблиц и вставить заново, вместо того, чтобы делать "Upsert" (хороший термин @marc_s). Есть одна рекомендация: я бы порекомендовал использовать TRUNCATE для очистки ваших таблиц, а не DELETE. Это работает намного лучше, потому что движок избегает записи всех этих удаленных записей в журнал транзакций. Очевидно, что вам сначала нужно удалить свои «дополнительные» таблицы, те, которые имеют FK для других таблиц.

Если вы обнаружите, что таблицы имеют циклические ссылки, которые затрудняют удаление строк из таблиц, то вот что я бы сделал:

  1. Снимите все ограничения со своих таблиц
  2. Усечение ваших целевых таблиц (последовательность не имеет значения, так как ваши ограничения исчезли)
  3. Импорт данных (используйте bcp, если вы можете для быстрой загрузки!)
  4. Повторно применить ограничения
  5. (Необязательно) Обновить статистику по целевым таблицам
...