我想从表中删除约束。我的查询是:
ALTER TABLE `tbl_magazine_issue`
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`
但是我得到一个错误:
#1064
-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册,以FK_tbl_magazine_issue_mst_users
在第1行的'constraint ' 附近使用正确的语法
我想从表中删除约束。我的查询是:
ALTER TABLE `tbl_magazine_issue`
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`
但是我得到一个错误:
#1064
-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册,以FK_tbl_magazine_issue_mst_users
在第1行的'constraint ' 附近使用正确的语法
Answers:
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;
某些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 8.0.19中ALTER TABLE tbl_name DROP CONSTRAINT symbol;
引入的语法:
从MySQL 8.0.19开始,ALTER TABLE允许使用更通用的(和SQL标准)语法来删除和更改任何类型的现有约束,其中约束类型由约束名称确定
ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;
这将在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(实际上没有创建约束)。