Как удалить ограничения из моей таблицы MySQL?

252

Я хочу удалить ограничения из моей таблицы. Мой запрос:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

Но я получил ошибку:

#1064- у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с «ограничение FK_tbl_magazine_issue_mst_users» в строке 1

Дипу Санкар
источник
1
Стоит отметить, что если вы создали CHECKограничение, нет необходимости удалять его, потому что фактическое ограничение не создается. Вы можете выбрать information_schema.table_constraintsдля проверки, и вы можете запускать add constraintснова и снова без каких-либо ошибок. MySQL не поддерживает CHECKограничения, но позволяет SQL создавать их (без фактического создания ограничений).
ADTC
Возможный дубликат удаления первичного ключа в MySQL
瑲 瑲
Ваш синтаксис полностью действителен и теперь поддерживается демо
Лукаш Шозда

Ответы:

423

Mysql имеет специальный синтаксис для удаления ограничений внешнего ключа:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users
Богемский
источник
21
Postgres, MSSQL и Oracle все имеют alter table .. drop constraint. Похоже, что MySQL - нечетный выход.
Джаред Бек,
Он говорит, что не может отбрасывать "column2", потому что он необходим в ограничении внешнего ключа. Когда я делаю, как вы говорите, я получаю "Cant DROP column2; проверьте, что столбец / ключ существует"
Lealo
Хорошо, я понял, что чужое - это отдельная вещь, просто соединяющая столбец с другими столбцами таблиц. У меня было стандартное имя, данное ему. Также теперь я теперь, когда вы можете безопасно отбрасывать внешние ключи без удаления самого столбца
Lealo
1
Решение Веллингтона Лориндо можно рассматривать как более правильное, поскольку простое удаление внешнего ключа не приведет к удалению соответствующего индекса. Конечно, индекс мог быть создан отдельно, но если он был создан в результате добавления внешнего ключа, то он не будет удален простым удалением внешнего ключа.
Рич Хардинг
55

У меня была та же проблема, и я должен решить с помощью этого кода:

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;
Веллингтон Лориндо
источник
2
Это может показаться более правильным, чем принятое решение, потому что простое удаление внешнего ключа не приведет к удалению индекса. Конечно, индекс мог быть создан отдельно, но если он был создан в результате добавления внешнего ключа, то он не будет удален простым удалением внешнего ключа.
Рич Хардинг
3
Как одна команда: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
Фрэнк Форте
26

Там нет такого понятия, как DROP CONSTRAINTв MySQL. В вашем случае вы могли бы использовать DROP FOREIGN KEYвместо этого.

Лотар
источник
12

Если ограничение не является внешним ключом, например. один добавляется с помощью «UNIQUE CONSTRAINT (colA, colB)», тогда это индекс, который можно удалить с помощьюALTER TABLE ... DROP INDEX ...

Роберт Найт
источник
9

Также замечательно, что вы можете временно отключить все проверки внешнего ключа в базе данных mysql: SET FOREIGN_KEY_CHECKS=0; и снова включить: SET FOREIGN_KEY_CHECKS=1;

roelleor
источник
8

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

ALTER TABLE `table_name` DROP KEY `uc_name`;

или

ALTER TABLE `table_name` DROP INDEX `uc_name`;
jbobbins
источник
4

Некоторые ORM или структуры используют другое соглашение об именах для внешних ключей, чем по умолчанию FK_[parent table]_[referenced table]_[referencing field], потому что они могут быть изменены.

Laravel, например, использует в [parent table]_[referencing field]_foreignкачестве соглашения об именах. Вы можете показать имена внешних ключей с помощью этого запроса, как показано здесь :

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_SCHEMA = '<database>' AND REFERENCED_TABLE_NAME = '<table>';

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

Piscator
источник
2

Для тех, кто приходит сюда, используя MariaDB:

Обратите внимание, что MariaDB в целом допускает операторы DROP CONSTRAINT, например, для удаления проверочных ограничений:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

https://mariadb.com/kb/en/library/alter-table/

Маркус Бартлен
источник
Да, это для ограничений, которые находятся в одной таблице, например CONSTRAINT CHECK(a > b). Для ограничений внешнего ключа, похоже, вам все еще нужен DROP FOREIGN KEYсинтаксис, по крайней мере, в MariaDB версии 10.2
Фрэнк Форте
1
  1. Перейти к структурному виду таблицы
  2. Вы увидите 2 варианта вверху. Структура таблицы b. Отношение зрения .
  3. Теперь нажмите на представление Relation , здесь вы можете удалить ограничение внешнего ключа. Вы получите все отношения здесь.
Акшай Шарма
источник
Это здорово, сработало для меня, когда вы не знаете удостоверение
личности
0

Там нет DROP CONSTRAINTВ MySql. Эта работа, как магия в MySQL 5.7

ALTER TABLE answer DROP KEY const_name;
Юнесс ХАРДИ
источник
0

Самый простой способ снять ограничение - использовать синтаксис, ALTER TABLE tbl_name DROP CONSTRAINT symbol;представленный в MySQL 8.0.19 :

Начиная с MySQL 8.0.19, ALTER TABLE допускает более общий (и стандартный SQL) синтаксис для удаления и изменения существующих ограничений любого типа, где тип ограничения определяется из имени ограничения

ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;

db <> Fiddle demo

Лукаш Шозда
источник
-4

это будет работать на MySQL, чтобы снять ограничения

alter table tablename drop primary key;

alter table tablename drop foreign key;
рейнджита
источник
DROP PRIMARY KEYне должно работать. DROP FOREIGN KEYработает, но вам нужно указать, кому drop. НапримерALTER TABLE tablename DROP FOREIGN KEY id_name_fk
RousseauAlexandre