Я хочу удалить ограничения из моей таблицы. Мой запрос:
ALTER TABLE `tbl_magazine_issue`
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`
Но у меня есть ошибка:
#1064
- У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'constraintFK_tbl_magazine_issue_mst_users
' в строке 1
Mysql имеет специальный синтаксис для ограничения ограничений внешнего ключа:
ALTER TABLE tbl_magazine_issue
DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users
alter table .. drop constraint
. Похоже, что MySQL - нечетный выход.
У меня была такая же проблема, и мне пришлось решить этот код:
ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX `id_name_fk`;
ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
В MySQL нет такой вещи, как DROP CONSTRAINT
. В вашем случае вы можете использовать DROP FOREIGN KEY
вместо этого.
Если ограничение не является внешним ключом, например. один добавлен с использованием "UNIQUE CONSTRAINT (colA, colB)", то это индекс, который можно отбросить с помощью ALTER TABLE ... DROP INDEX ...
Чтобы добавить немного ответа Роберта Найта, поскольку заголовок сообщения сам по себе не упоминает внешние ключи (и поскольку у него нет полных образцов кода, а так как блоки кода комментариев SO не отображаются, а также блоков ответов ответов), я добавлю это для уникальных ограничений. Любое из этих действий позволяет отказаться от ограничения:
ALTER TABLE `table_name` DROP KEY `uc_name`;
или
ALTER TABLE `table_name` DROP INDEX `uc_name`;
Также хорошо, вы можете временно отключить все проверки внешнего ключа из базы данных mysql: SET FOREIGN_KEY_CHECKS=0;
И чтобы включить его снова: SET FOREIGN_KEY_CHECKS=1;
Некоторые 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 и его собственное имя.
Для тех, кто приходит сюда с помощью MariaDB:
Обратите внимание, что MariaDB позволяет операторам DROP CONSTRAINT в целом, например, для отмены контрольных ограничений:
ALTER TABLE table_name
DROP CONSTRAINT constraint_name;
CONSTRAINT CHECK(a > b)
. Для ограничений внешнего ключа, похоже, вам все еще нужен синтаксис DROP FOREIGN KEY
, по крайней мере, в MariaDB версии 10.2
это будет работать на 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
CHECK
, его не нужно удалять, потому что фактическое ограничение не создается. Вы можете выбрать изinformation_schema.table_constraints
для проверки, и вы даже можете запускатьadd constraint
снова и снова без каких-либо ошибок. MySQL не поддерживает ограниченияCHECK
но позволяет SQL создавать их (без фактического создания ограничений).