невозможно удалить объект так как на него ссылается ограничение foreign key
Не удалось удалить объект 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.’ является схемой, производной системой по умолчанию, поэтому вам не нужно указывать это в следующей команде. Не беспокойтесь, даже если вы укажете схему, она будет работать.
SQL-Ex blog
Новости сайта «Упражнения SQL», статьи и переводы
Удалить таблицу, если она существует
В рамках интерактивного (чистого) SQL избежать возникновения ошибки в этом случае не получалось. Однако проблема легко решается процедурно (T-SQL):
Встроенная функция object_id возвращает идентификатор объекта, заданного именем, или же NULL, если такого имени не существует.
И вот в SQL Server 2017 появился оператор DROP TABLE IF EXISTS, который не вызывает ошибки, если удаляемой таблицы не существует, например:
Теперь предположим, что нам нужно удалить связанные таблицы. Рассмотрим следующий пример:
id | t1_id |
---|---|
1 | 1 |
2 | 2 |
Стандартное каскадное удаление
работать не будет, т.к. оно еще не реализовано в SQL Server (но работает, например, в PostgreSQL), тогда как оператор
Если указать таблицы в неправильном порядке, т.е. t1, t2, то при удалении t1 будет получена вышеприведенная ошибка, а потом будет удалена t2.
Если среди перечисленных таблиц (не обязательно две) могут быть отсутствующие, то тогда поможет новый оператор:
который будет создавать таблицу только в том случае, если такой не существует.
Обратные ссылки
Нет обратных ссылок
Комментарии
Показывать комментарии Как список | Древовидной структурой
Автор не разрешил комментировать эту запись
Невозможно усечь таблицу, поскольку на нее ссылается ограничение внешнего ключа
Я получаю следующее сообщение, даже когда таблица, ссылающаяся на нее, пуста: «не удается усечь таблицу ‘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.
Ниже приведена упрощенная структура таблицы:
Теперь таблица выглядит примерно так:
Обратите внимание, что первая строка является корневым сообщением, и дерево этого сообщения может быть отображено как:
Моя проблема возникает, когда я пытаюсь удалить все строки под одним и тем же Owner_Id в одном запросе. Пример:
Вышеприведенный запрос завершается с ошибкой:
Помимо отключения внешних ключей, которое является опасным и может привести к несоответствиям, есть еще два варианта:
Измените FOREIGN KEY ограничения с помощью ON DELETE CASCADE опции. Я не проверял все случаи, но вам наверняка нужно это для (owner_id) внешнего ключа и, возможно, для другого.
Если вы сделаете это, то удалить узел и всех потомков из дерева проще. Вы удаляете узел, и все потомки удаляются посредством каскадных действий:
Проблема, с которой вы столкнулись, на самом деле 2 проблемы. Во-первых, удаление из таблицы с внешним ссылочным ключом, который ссылается на себя, не является серьезной проблемой для MySQL, если нет строки, которая ссылается на себя. Если есть строка, как в вашем примере, варианты ограничены. Либо отключите внешние ключи, либо используйте CASCADE действие. Но если таких строк нет, удаление становится меньшей проблемой.
Тогда вы наткнетесь на вторую проблему! Выполнение вашего запроса вызовет похожую ошибку:
Ошибка (и), предупреждение (я):
Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется (rextester.forum, CONSTRAINT owner_id_frgn FOREIGN KEY (owner_Id) ССЫЛКИ форум (id))
Причина этой ошибки будет иной, чем раньше. Это связано с тем, что MySQL проверяет каждое ограничение после удаления каждой строки, а не (как следует) в конце оператора. Поэтому, когда родитель удаляется до того, как будет удален его дочерний элемент, мы получаем ошибку ограничения внешнего ключа.
Небольшое примечание: мы могли (или должны) использовать условие, которое учитывает и вложенную модель. Это эквивалентно (и может использовать индекс (nleft, nright) для поиска узлов, которые нужно удалить:
Удаление таблиц (компонент Database Engine)
Удалить таблицу из базы данных в SQL Server можно с помощью среды SQL Server Management Studio или Transact-SQL.
Каждое удаление таблицы следует тщательно планировать. Если на таблицу ссылаются существующие запросы, представления, определяемые пользователем функции, хранимые процедуры или программы, то удаление сделает эти объекты недействительными.
В этом разделе
Перед началом работы
Удаление таблицы с помощью следующих средств:
Перед началом
Ограничения
Инструкцию DROP TABLE нельзя использовать для удаления таблицы, на которую ссылается ограничение FOREIGN KEY. Сначала следует удалить ссылающееся ограничение FOREIGN KEY или ссылающуюся таблицу. Если и ссылающаяся таблица, и таблица, содержащая первичный ключ, удаляются с помощью одной инструкции DROP TABLE, ссылающаяся таблица должна быть первой в списке.
При удалении таблицы относящиеся к ней правила и значения по умолчанию теряют привязку, а любые связанные с таблицей ограничения или триггеры автоматически удаляются. Если таблица будет создана заново, нужно будет заново привязать все правила и значения по умолчанию, заново создать триггеры и добавить необходимые ограничения.
При удалении таблицы, которая содержит столбец varbinary (max) с атрибутом FILESTREAM, не будут удалены никакие данные, которые хранятся в файловой системе.
Инструкции DROP TABLE и CREATE TABLE нельзя выполнять для одной таблицы в одном пакете. В противном случае может произойти непредвиденная ошибка.
Любые представления или хранимые процедуры, которые ссылаются на удаляемую таблицу, необходимо явно удалить или изменить, чтобы убрать ссылку на таблицу.
безопасность
Permissions
Использование среды SQL Server Management Studio
Удаление таблицы из базы данных
В обозревателе объектов выберите таблицу, которую необходимо удалить.
Появится окно подтверждения удаления. Нажмите кнопку Да.
При удалении таблицы автоматически удаляются все связи с ней.
Использование Transact-SQL
Удаление таблицы в редакторе запросов
В обозревателе объектов подключитесь к экземпляру компонента Компонент Database Engine.
На стандартной панели выберите пункт Создать запрос.
Скопируйте следующий пример в окно запроса и нажмите кнопку Выполнить.
Дополнительные сведения см. в статье DROP TABLE (Transact-SQL).