Используя MSSQL2005, можно ли обрезать таблицу с ограничением внешнего ключа, если я сначала усекаю дочернюю таблицу (таблицу с первичным ключом отношения FK)?
Я знаю, что я могу либо
- Используйте
DELETE
без условия where, а затемRESEED
личность (или) - Удалите FK, обрежьте таблицу и воссоздайте FK.
Я думал, что пока я обрезаю дочернюю таблицу до родительской, я буду в порядке, не выполнив ни один из указанных выше вариантов, но я получаю эту ошибку:
Невозможно усечь таблицу «TableName», так как на нее ссылается ограничение FOREIGN KEY.
источник
Обратите внимание, что это, вероятно, не то, что вы хотели бы, если у вас есть миллионы + записей, поскольку это очень медленно
источник
Поскольку
TRUNCATE TABLE
это команда DDL , она не может проверить, ссылаются ли записи в таблице на запись в дочерней таблице.Вот почему
DELETE
работает иTRUNCATE TABLE
не работает: потому что база данных может убедиться, что на нее не ссылается другая запись.источник
Без
ALTER TABLE
Как хранимая процедура
https://github.com/reduardo7/TableTruncate
Обратите внимание, что это, вероятно, не то, что вы хотели бы, если у вас есть миллионы + записей, поскольку это очень медленно.
источник
Решение @denver_citizen, представленное выше, не работает для меня, но мне понравился его дух, поэтому я изменил несколько вещей:
Для блага публики вот обновленный скрипт:
источник
используйте следующую команду после удаления всех строк в этой таблице с помощью оператора delete
РЕДАКТИРОВАТЬ: исправлен синтаксис для SQL Server
источник
TRUNCATE
избегает журнала и значительно быстрее, чемDELETE
для больших таблиц. Таким образом, это не совсем эквивалентное решение.Ну, так как я не нашел примеров этого очень простое решение , я использовал, что:
Здесь это идет:
1) Найдите имя внешнего ключа, который вызывает ошибку (например: FK_PROBLEM_REASON, с полем
ID
, из таблицыTABLE_OWNING_CONSTRAINT
) 2) Удалите этот ключ из таблицы:3) Обрезать требуемый стол
4) Повторно добавьте ключ к этой первой таблице:
Вот и все.
источник
Вот сценарий, который я написал, чтобы автоматизировать процесс. Я надеюсь, что это помогает.
источник
sys.foreign_keys
таблице. ( Ссылка )Вы можете выполнить этот шаг, По
reseeding table
вы можете удалить данные таблицы.если возникнет какая-то ошибка, вам придется заново заполнить основную таблицу.
источник
источник
Если я правильно понимаю, вам нужно иметь чистую среду для БД, включающую интеграционные тесты.
Мой подход заключается в том, чтобы отбросить всю схему и воссоздать ее позже.
Причины:
источник
Найдено в другом месте в Интернете
источник
Вы не можете обрезать таблицу, если не отбрасываете ограничения. Отключение также не работает. тебе нужно все бросить. Я сделал скрипт, который отбрасывает все ограничения, а затем воссоздает.
Обязательно заверните это в транзакцию;)
источник
Ответы @denver_citizen и @Peter Szanto не совсем помогли мне, но я изменил их, чтобы учесть:
источник
truncate не работает для меня, delete + reseed - лучший выход. В случае, если есть некоторые из вас, которым нужно выполнить итерации по огромному количеству таблиц для выполнения удаления + повторного заполнения, вы можете столкнуться с проблемами с некоторыми таблицами, у которых нет столбца идентификаторов, следующий код проверяет, существует ли столбец идентификаторов, прежде чем пытаться пересеивать
источник
Я написал следующие способы и попытался их параметризовать, чтобы вы могли запустить их в виде
Query document
или сделать полезноеSP
с ними легко .А) Удалить
Если в вашей таблице нет миллионов записей, это хорошо работает и не имеет команд Alter :
Б) усекать
Если в вашей таблице миллионы записей или у вас нет проблем с командой Alter в ваших кодах, используйте эту:
источник
Это мое решение этой проблемы. Я использовал его для изменения ПК, но идея та же. Надеюсь это будет полезно)
источник
По
MS SQL
крайней мере, для более новых версий вы можете просто отключить ограничения с помощью следующего кода:источник
Следующее работает для меня даже с ограничениями FK и объединяет следующие ответы только для удаления указанных таблиц :
Замечания:
Я думаю, что все еще помогает объявить таблицы в том порядке, в котором вы хотите их удалить (т.е. сначала убить зависимости). Как видно из этого ответа , вместо циклических имен вы можете заменить все таблицы
источник
DELETE
это не то же самое, чтоTRUNCATE
. Это заполнит ваши журналы транзакций.Если ни один из этих ответов не сработал так, как в моем случае, сделайте следующее:
Удачи!
источник
Удалить, а затем сбросить автоинкремент:
тогда
источник
Единственный способ - сбросить внешние ключи перед выполнением усечения. И после усечения данных вы должны заново создать индексы.
Следующий скрипт генерирует необходимый SQL для удаления всех ограничений внешнего ключа.
Затем следующий скрипт генерирует необходимый SQL для повторного создания внешних ключей.
Запустите сгенерированный скрипт, чтобы удалить все внешние ключи, обрезать таблицы, а затем запустите сгенерированный скрипт, чтобы заново создать все внешние ключи.
Запросы взяты отсюда .
источник
В SSMS у меня была открытая диаграмма, показывающая ключ. После удаления ключа и усечения файла я обновил его, затем снова сосредоточился на диаграмме и создал обновление, очистив и восстановив поле Identity. При сохранении диаграммы появилось диалоговое окно «Сохранить», после чего в диалоговом окне «Изменения были внесены в базу данных во время работы», нажав «Да», восстановил ключ и восстановил его из заблокированной копии на диаграмме.
источник
Если вы делаете это с любой частотой, черт возьми, даже по расписанию, я бы абсолютно, однозначно никогда не использовал бы оператор DML. Стоимость записи в журнал транзакций слишком высока, и установка всей базы данных в
SIMPLE
режим восстановления для усечения одной таблицы - просто смешно.Лучший способ, к сожалению, трудный или трудоемкий. Это существо:
Мой процесс для этого включает в себя следующие шаги:
Сценарии такого рода должны быть сделаны в блоке
begin tran
andcommit tran
.источник
Я только что обнаружил, что вы можете использовать таблицу TRUNCATE в родительской таблице с ограничениями внешнего ключа для дочернего элемента, если вы отключите ограничения для дочернего элемента. сначала таблицы. Например
Внешний ключ CONSTRAINT child_par_ref для дочерней таблицы, ссылается на PARENT_TABLE
источник
Самый простой способ:
1 - ввести в phpmyadmin
2 - щелкнуть имя таблицы в левом столбце
3 - щелкнуть в операции (верхнее меню)
4 - нажать «Очистить таблицу (TRUNCATE)
5 - отключить окно« Включить проверку внешнего ключа »
6 - сделано !
Ссылка на учебное
пособие Учебное пособие: http://www.imageno.com/wz6gv1wuqajrpic.html
(извините, у меня недостаточно репутации для загрузки изображений здесь: P)
источник
Вы могли бы попробовать
DELETE FROM <your table >;
.Сервер покажет вам имя ограничения и таблицу, и, удалив эту таблицу, вы можете удалить то, что вам нужно.
источник
ссылка - усечь таблицу с ограниченным внешним ключом
Работа для меня в MYSQL
источник