невозможно усечь таблицу так как на нее ссылается ограничение foreign key

Не удается усечь таблицу, поскольку на нее ссылается ограничение FOREIGN KEY?

Используя MSSQL2005, можно ли обрезать таблицу с ограничением внешнего ключа, если я сначала усекаю дочернюю таблицу (таблицу с первичным ключом отношения FK)?

Я знаю, что я могу либо

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

Невозможно усечь таблицу «TableName», так как на нее ссылается ограничение FOREIGN KEY.

Правильный; Вы не можете обрезать таблицу с ограничением FK.

Обычно мой процесс для этого:

(Все в сделке, конечно.)

Конечно, это применимо только в том случае, если child уже обрезан. В противном случае я иду другим путем, полностью завися от того, как выглядят мои данные. (Слишком много переменных, чтобы попасть сюда.)

Оригинальный плакат определил, ПОЧЕМУ это так; смотрите этот ответ для более подробной информации.

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

Как хранимая процедура

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

Решение @denver_citizen, представленное выше, не работает для меня, но мне понравился его дух, поэтому я изменил несколько вещей:

Для блага публики вот обновленный скрипт:

используйте следующую команду после удаления всех строк в этой таблице с помощью оператора delete

Правка: исправлен синтаксис для SQL Server

вы можете выполнить этот шаг, С помощью reseeding table вы можете удалить данные таблицы.

если возникнет какая-то ошибка, вам придется заново заполнить основную таблицу.

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

Найдено в другом месте в Интернете

Ну, так как я не нашел examples очень простого решения, которое я использовал, а именно:

3) Обрезать требуемый стол

4) Повторно добавьте ключ к этой первой таблице:

Мой подход здесь состоит в том, чтобы отбросить всю схему и воссоздать ее позже.

Причины:

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

Обязательно заверните это в транзакцию;)

Это мое решение этой проблемы. Я использовал его для изменения ПК, но идея та же. Надеюсь это будет полезно)

Я пишу следующие способы и пытался их параметризовать, чтобы вы могли запускать их с помощью Query document или создавать полезные SP с ними легко.

А) Удалить

Если в вашей таблице нет миллионов записей, это хорошо работает, а в нет команд Alter:

Б) усекать

Если в вашей таблице есть миллионы записей или у вас нет проблем с командой Alter в ваших кодах, используйте эту:

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

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

Заметка:

Ответ @ denver_citizen мне не совсем помог, но я изменил его, чтобы учесть:

Если ни один из этих ответов не сработал так, как в моем случае, сделайте следующее:

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

Лучший способ, к сожалению, трудный или трудоемкий. Это существо:

Мой процесс для этого включает в себя следующие шаги:

Удалить, а затем сбросить автоинкремент:

В любом случае, он выполняет предварительную обработку, выбирая некоторые большие переменные nvarchar(max) : одну для удаления внешних ключей, одну для запуска триггеров отключения/усечения таблицы/включения и, наконец, одну для восстановления внешних ключей. Затем он либо печатает, либо выполняет результаты.

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

Чтобы вызвать его для некоторых одноразовых таблиц в нескольких схемах со странными именами ограничений (и, возможно, с небольшим злонамеренным вводом), вот суть моего тестового набора:

И, наконец, вот клубок пряжи. Я надеюсь, что это делает кто-то некоторые хорошие 😉

В SSMS у меня была открытая диаграмма, показывающая ключ. После удаления ключа и усечения файла я обновил его, затем снова сосредоточился на диаграмме и создал обновление, очистив, а затем восстановив поле Identity. При сохранении диаграммы появилось диалоговое окно «Сохранить», после чего в диалоговом окне «Изменения были внесены в базу данных во время работы», нажав «Да», восстановил ключ и восстановил его из заблокированной копии на диаграмме.

Источник

Невозможно усечь таблицу, поскольку на нее ссылается ограничение FOREIGN KEY?

Могу ли я с помощью MSSQL2005 усечь таблицу с ограничением внешнего ключа, если сначала усечу дочернюю таблицу (таблицу с первичным ключом отношения FK)?

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

Невозможно усечь таблицу «TableName», поскольку на нее ссылается ограничение FOREIGN KEY.

29 ответов

Верный; вы не можете усечь таблицу, которая имеет ограничение FK.

Читайте также:  м16 почему так называется

Обычно мой процесс для этого:

(Конечно, все в транзакции.)

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

Исходный плакат определял, ПОЧЕМУ это так; см. этот ответ для более подробной информации.

Используйте следующую команду после удаления всех строк в этой таблице с помощью оператора удаления

РЕДАКТИРОВАТЬ: исправленный синтаксис для SQL Server

Следующий сценарий генерирует требуемый SQL для снятия всех ограничений внешнего ключа.

Затем следующий сценарий генерирует требуемый SQL для воссоздания внешних ключей.

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

Я только что обнаружил, что вы можете использовать таблицу TRUNCATE для родительской таблицы с ограничениями внешнего ключа для дочернего элемента, если сначала вы ОТКЛЮЧИТЕ ограничения для дочерней таблицы. Например.

Внешний ключ CONSTRAINT child_par_ref в дочерней таблице, ссылается на PARENT_TABLE

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

Как хранимая процедура

Приведенное выше решение @denver_citizen не сработало для меня, но мне понравился его дух, поэтому я изменил несколько вещей:

В интересах общественности вот обновленный скрипт:

Что ж, поскольку я не нашел примеров того очень простого решения, которое я использовал, а именно:

3) Обрезать разыскиваемую таблицу

4) Повторно добавьте ключ в эту первую таблицу:

Процесс удаляет ограничение внешнего ключа и усекает таблицу, а затем добавляет ограничение, выполнив следующие шаги.

Вы можете выполнить этот шаг, С помощью reseeding table вы можете удалить данные таблицы.

Если возникает какая-то ошибка, вам необходимо повторно заполнить основную таблицу.

Вот сценарий, который я написал для автоматизации процесса. Я надеюсь, что это помогает.

Ответы @denver_citizen и @Peter Szanto у меня не совсем сработали, но я изменил их, чтобы учесть:

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

Обязательно заверните в транзакцию;)

Если я правильно понимаю, вы хотите создать чистую среду для БД, включающую интеграционные тесты.

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

Причины:

Найдено в другом месте в Интернете

А) Удалить

Б) Усечь

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

В моем ответе выше метод решения упомянутой проблемы в вопросе основан на @LauroWolffValenteSobrinho answer.

Если у вас несколько ОГРАНИЧЕНИЙ, тогда вы должны добавить его коды, как я, в указанный выше запрос

Также вы можете изменить указанную выше базу кода @SerjSagan answer, чтобы отключить включение ограничения

Это мое решение этой проблемы. Я использовал его для изменения ПК, но идея та же. Надеюсь, это будет полезно)

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

Примечание.

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

Если ни один из этих ответов не сработал, как в моем случае, сделайте следующее:

Удалить и сбросить автоинкремент:

В SSMS у меня была открыта диаграмма с ключом. После удаления ключа и усечения файла, который я обновил, я снова сфокусировался на диаграмме и создал обновление, очистив, а затем восстановив поле удостоверения. При сохранении диаграммы открылось диалоговое окно «Сохранить», а затем диалоговое окно «Изменения были внесены в базу данных, когда вы работали», щелкнув Да, восстановив ключ, восстановив его из закрепленной копии в диаграмме.

Мой процесс для этого включает следующие шаги:

Это пример для тех, кто использует Entity Framework.

Таблица для сброса: Foo

Другая таблица, которая зависит от: Bar

Столбец ограничений в таблице Foo : FooColumn

Столбец ограничений в таблице Bar : BarColumn

Источник

Не удалось удалить объект dbo.Table1, поскольку на него ссылается ограничение FOREIGN KEY

Несмотря на то, что я удаляю и пытаюсь удалить таблицу, я получаю ошибку,

Msg 3726, уровень 16, состояние 1, строка 2 Не удалось удалить объект dbo.Table1, поскольку на него ссылается ограничение FOREIGN KEY.

Использование SQL Server 2012

Я создал сценарий с помощью sql server 2012, значит, сервер sQL дал мне неправильный сценарий?

5 ответов

Не уверен, правильно ли я понял, что вы пытаетесь сделать, скорее всего, Table1 упоминается как FK в другой таблице.

Если вы это сделаете:

Это даст вам все таблицы, в которых первичный ключ Table1 является FK.

Удаление ограничений, существующих внутри таблицы, не является необходимым шагом для удаления самой таблицы. Удаление всех возможных FK, ссылка на которые есть «Table1».

Читайте также:  Выразительные глаза что это значит

Что касается второй части вашего вопроса, автоматические сценарии SQL Server во многих отношениях слепы. Скорее всего, таблица, которая мешает вам удалить Table1, опускается ниже или вообще не изменяется сценарием. У RedGate есть несколько инструментов, которые помогают с этими каскадными удалениями (обычно, когда вы пытаетесь удалить кучу таблиц), но он не пуленепробиваемый и довольно дорогой. http://www.red-gate.com/products/sql- разработка / sql-toolbelt /

Во-первых, вам нужно сбросить свой FK.

Я могу порекомендовать вам взглянуть на этот пост о переполнении стека, это очень интересно. Это называется: ограничение внешнего ключа SQL DROP TABLE

Есть хорошее объяснение того, как это сделать.

. Не отбрасывает вашу таблицу, если на нее действительно ссылаются внешние ключи.

Чтобы получить все отношения внешнего ключа, ссылающиеся на вашу таблицу, вы можете использовать этот SQL (если вы используете SQL Server 2005 и выше):

Вам нужно удалить FK в таблице, в которую он был добавлен, теперь это может быть таблица 2, таблица 3 или любая другая таблица, которая ссылается на столбец Table1 как внешний ключ. Затем вы можете удалить Table1.

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

Это происходит потому, что таблица, которую вы пытаетесь изменить, имеет первичный ключ (PK), который упоминается как внешний ключ (FK) где-то в другой таблице. Чтобы узнать, что это за таблица, выполните следующую хранимую процедуру:

EXEC sp_fkeys ‘Table_Name’

А затем запустите команду drop, которая выглядит следующим образом:

DROP TABLE Table_Name

Примечание: ‘dbo.’ является схемой, производной системой по умолчанию, поэтому вам не нужно указывать это в следующей команде. Не беспокойтесь, даже если вы укажете схему, она будет работать.

Источник

Не удается обрезать таблицу, потому что на нее ссылается ограничение FOREIGN KEY?

Используя MSSQL2005, могу ли я обрезать таблицу с ограничением внешнего ключа, если я сначала усекаю дочернюю таблицу (таблицу с первичным ключом отношения FK)?

Я знаю, что могу либо

Я думал, что до тех пор, пока я усекаю дочернюю таблицу перед родителем, я буду в порядке, не выполняя ни одного из вышеперечисленных вариантов, но я получаю эту ошибку:

Невозможно обрезать таблицу «TableName», потому что на нее ссылается ограничение FOREIGN KEY.

ОТВЕТЫ

Ответ 1

Правильно; вы не можете обрезать таблицу, на которой есть ограничение FK.

Обычно мой процесс для этого:

(Все в транзакции, конечно.)

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

Оригинальный плакат определил ПОЧЕМУ это так; см. этот ответ для более подробной информации.

Ответ 2

Обратите внимание, что это, вероятно, не то, что вам нужно, если у вас есть millions+ записей, так как это очень медленно.

Ответ 3

Поскольку TRUNCATE TABLE является команда DDL, он не может проверить, не являются ли записи в таблице ссылаясь на запись в дочерней таблице.

Ответ 4

Как хранимая процедура

Обратите внимание,, что это, вероятно, не то, что вам нужно, если у вас есть millions+ записей, так как это очень медленно.

Ответ 5

Решение @denver_citizen, предоставленное выше, не сработало для меня, но мне понравился его дух, поэтому я изменил несколько вещей:

В интересах общественности здесь находится обновленный script:

Ответ 6

используйте следующую команду после удаления всех строк в этой таблице с помощью инструкции delete

EDIT: Исправленный синтаксис для SQL Server

Ответ 7

вы можете следовать этому шагу, В reseeding table вы можете удалить данные таблицы.

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

Ответ 8

Вот script, который я написал для автоматизации процесса. Надеюсь, это поможет.

Ответ 9

Ну, так как я не нашел примеров очень простого решения, которое я использовал:

3) Таблица, требующая усечения

4) Повторно добавьте ключ к этой первой таблице:

Ответ 10

Найден в другом месте в Интернете

Ответ 11

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

Мой подход здесь заключается в том, чтобы удалить всю схему и воссоздать ее позже.

Причины:

Ответ 12

Вы не можете обрезать таблицу, если не отбрасываете ограничения. Отключение также не работает. вам нужно сбросить все. я сделал script, который удаляет все constrainsts, а затем воссоздает.

Обязательно заверните его в транзакцию;)

Ответ 13

Ответ 14

Ответ 15

A) Удалить

Если у вашей таблицы нет миллионов записей, это работает хорошо, а не имеет никаких команд Alter:

B) Усекать

Если в вашей таблице есть миллионы записей или у вас нет проблем с командой Alter в ваших кодах, используйте следующую команду:

В приведенном выше ответе метод решения указанной проблемы в вопросе основан на @LauroWolffValenteSobrinho answer.

Если у вас более одного CONSTRAINT, вы должны добавить свои коды, подобные мне, в указанный выше запрос

Также вы можете изменить приведенную выше базу кода @SerjSagan answer, чтобы отключить ограничение включения

Ответ 16

Это мое решение этой проблемы. Я использовал его для изменения ПК, но идея такая же. Надеюсь, это будет полезно)

Ответ 17

Ответ 18

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

Читайте также:  на свете жить с азартом так опасно

Примечание:

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

Ответ 19

Если ни один из этих ответов не работал, как в моем случае, сделайте следующее:

Ответ 20

Ответы @denver_citizen и @Peter Szanto не совсем помогли мне, но я изменил их, чтобы учесть:

Ответ 21

Удалить, а затем сбросить автоинкремент:

Ответ 22

В SSMS я открыл Диаграмму, показывая Ключ. После удаления ключа и усечения файла я обновился, а затем снова сфокусировался на Диаграмме и создал обновление, очистив, а затем восстановив окно Identity. Сохранение диаграммы вызвало диалоговое окно «Сохранить», чем «Диалоговое окно» Изменения были внесены в базу данных во время работы «, нажав» Да «, восстановил ключ, восстановив его из запертой копии на диаграмме.

Ответ 23

Лучший способ, к сожалению, является трудным или трудоемким. Это:

Мой процесс для этого включает следующие шаги:

Ответ 24

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

Внешний ключ CONSTRAINT child_par_ref в дочерней таблице, ссылки PARENT_TABLE

Ответ 25

Ссылка на учебник изображений

Учебное пособие: http://www.imageno.com/wz6gv1wuqajrpic.html
(извините, у меня недостаточно репутации для загрузки изображений здесь: P)

Ответ 26

Сервер покажет вам имя ограничения и таблицу и удалит эту таблицу, которую вы можете удалить, что вам нужно.

Источник

Невозможно усечь таблицу, поскольку на нее ссылается ограничение внешнего ключа

Я получаю следующее сообщение, даже когда таблица, ссылающаяся на нее, пуста: «не удается усечь таблицу ‘dbo.Link’, потому что на нее ссылается ограничение внешнего ключа», похоже, не имеет особого смысла, почему это происходит. Есть предложения?

5 ответов

Я пытаюсь отбросить таблицу, но получаю следующее сообщение: Msg 3726, Уровень 16, Состояние 1, Строка 3 Не удалось удалить объект ‘dbo.UserProfile’, поскольку на него ссылается ограничение внешнего ключа. Msg 2714, Уровень 16, Состояние 6, Строка 2 В базе данных уже есть объект с именем.

В SQL Server таблица, на которую ссылается a FK, в настоящее время не может быть усечена, даже если все ссылочные таблицы пусты или внешние ключи отключены.

Вы не можете усечь таблицу, которая имеет ограничение FK. В качестве обходного пути вы могли бы: 1/ отбросьте ограничения 2/ Транк стол 3/ воссоздайте ограничения.

Здесь это связанный скрипт T-SQL, предполагающий, что у вас есть 2 таблицы с именами MyTable и MyReferencedTable :

Выполните следующий запрос для поиска любого ограничения:

Если какое-либо ограничение найдено на вашем столе, удалите его.

Невозможно усечь таблицу, на которую ссылается ограничение внешнего ключа. Что я должен сделать в первую очередь, чтобы включить усечение? подробности: ( `guacamole`.`guacamole_connection_history`, CONSTRAINT `guacamole_connection_history_ibfk_2` FOREIGN KEY (`connection_id`) REFERENCES.

При выполнении первой синхронизации в репликации слиянием у меня возникает эта ошибка: Невозможно удалить таблицу dbo.eqp_Equipment, поскольку на нее ссылается ограничение внешнего ключа. (Источник: MSSQLServer, номер ошибки: 4712 ) Затем я изменил Action if name is in use на усечь все данные в.

Эта душа действует на меня как заклинание и едва ли заняла минуту, чтобы закончить. Я делаю это для маскировки.

Не для SQL Server, а только для MySQL.

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

После усечения таблицы

И, наконец, повторно активируйте проверку ограничений :

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

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

Используя MSSQL2005, могу ли я усечь таблицу с ограничением внешнего ключа, если сначала усеку дочернюю таблицу (таблицу с первичным ключом отношения FK)? Я знаю, что могу либо Используйте DELETE.

Мне нужно очистить много таблиц (желательно усечь таблицу). Но таблицы имеют много ограничений FK. Я пробовал что-то подобное, но потерпел неудачу:- ALTER TABLE Table1 NOCHECK CONSTRAINT ALL.

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

Я пытаюсь отбросить таблицу, но получаю следующее сообщение: Msg 3726, Уровень 16, Состояние 1, Строка 3 Не удалось удалить объект ‘dbo.UserProfile’, поскольку на него ссылается ограничение внешнего.

Невозможно усечь таблицу, на которую ссылается ограничение внешнего ключа. Что я должен сделать в первую очередь, чтобы включить усечение? подробности: ( `guacamole`.`guacamole_connection_history`.

При выполнении первой синхронизации в репликации слиянием у меня возникает эта ошибка: Невозможно удалить таблицу dbo.eqp_Equipment, поскольку на нее ссылается ограничение внешнего ключа. (Источник.

Я получаю следующую ошибку. Не удалось удалить объект ‘tablename’, поскольку на него ссылается ограничение внешнего ключа. Это означает, что есть ссылки на таблицу, которую я хочу усечь. Затем я.

У меня есть следующие таблицы: CREATE TABLE `companies_investorfundinground` ( `id` int(11) NOT NULL AUTO_INCREMENT, `funding_round_id` int(11) NOT NULL, `investor_id` int(11) NOT NULL, PRIMARY KEY.

Источник

Информационный образовательный портал