2012-02-12 1 views
0

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

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

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

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

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

SQL Server 2005 Cascading Delete

+0

Ну, вы не можете просто удалить материал прочь, если он на которую ссылается внешний ключ - это весь смысл иметь FK отношения! Итак, что вам нужно сделать: отбросьте все ограничения FK, ссылающиеся на таблицу «Product», затем удалите все строки и вставьте новые. Но что вы собираетесь делать с данными, которые могут быть исправлены для продукта, который больше не существует после того, как вы вставили новые данные ??? –

+0

@marc_s В моем проекте мы приносим свежие данные из SAP для таблицы продуктов, и мой клиент хочет удалить все записи всех 4 (в моем проекте 4 таблицы мастер-таблицы) мастер-таблицы и снова вставить свежие данные. Пожалуйста, дайте мне знать ваше мнение по этому вопросу, может ли это быть лучше? Я предлагаю то же самое моему клиенту. – Zerotoinfinity

+1

Вы полностью заменяете все строки? Или у вас есть много строк, которые останутся неизменными или просто изменятся в одной или двух столбцах?В этом случае было бы разумнее просто «обновить» таблицу «Продукты» - обновить то, что нужно обновить, вставить новые строки, удалить несколько строк, которые нужно удалить, вместо того, чтобы использовать метод «удалить все». ... –

ответ

1

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

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

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

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

  1. огонь.Пушка запрос на удаление .then

2.EXEC sp_MSforeachtable «UPDATE СТАТИСТИКА? С FULLSCAN»

3.Exec sp_MSforeachtable„DBCC DBREINDEX („?“)“

Смежные вопросы