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

206

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

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

Но у меня есть ошибка:

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

  • 0
    Стоит отметить, что если вы создали ограничение CHECK , его не нужно удалять, потому что фактическое ограничение не создается. Вы можете выбрать из information_schema.table_constraints для проверки, и вы даже можете запускать add constraint снова и снова без каких-либо ошибок. MySQL не поддерживает ограничения CHECK но позволяет SQL создавать их (без фактического создания ограничений).
Показать ещё 1 комментарий
Теги:
foreign-keys
constraints
alter

10 ответов

371
Лучший ответ

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

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users
  • 12
    У Postgres, MSSQL и Oracle есть alter table .. drop constraint . Похоже, что MySQL - нечетный выход.
  • 0
    Он говорит, что не может отбросить "column2", потому что он необходим в ограничении внешнего ключа. Когда я делаю, как вы говорите, я получаю "Cant DROP column2; проверьте, что столбец / ключ существует"
Показать ещё 2 комментария
41

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

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;
  • 1
    Это может показаться более правильным, чем принятое решение, поскольку простое удаление внешнего ключа не приведет к удалению индекса. Конечно, индекс мог быть создан отдельно, но если он был создан в результате добавления внешнего ключа, то он не будет удален простым удалением внешнего ключа.
  • 0
    В виде одной команды: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
23

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

11

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

4

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

ALTER TABLE `table_name` DROP KEY `uc_name`;

или

ALTER TABLE `table_name` DROP INDEX `uc_name`;
2

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

2

Некоторые 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 и его собственное имя.

1
  • Перейдите в представление структуры таблицы
  • Вы увидите 2 варианта в верхней структуре a.Table b. Соотношение.
  • Теперь нажмите Вид связи, здесь вы можете отказаться от ограничения внешнего ключа. Здесь вы получите все отношения.
  • 0
    Это здорово, работал для меня, когда вы не знаете идентификатор
0

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

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

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

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

  • 0
    Да, это для ограничений, которые находятся в одной и той же таблице, например, CONSTRAINT CHECK(a > b) . Для ограничений внешнего ключа, похоже, вам все еще нужен синтаксис DROP FOREIGN KEY , по крайней мере, в MariaDB версии 10.2
-6

это будет работать на MySQL для ограничения ограничений

alter table tablename drop primary key;

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню