长期不写基础的 MySQL 代码,笔者也开始犯一些低级错误。最近,笔者在尝试将表中某列的外键约束删除时,MySQL 却一直报该列本就不存在的错误。
笔者报错时的运行环境:
MySQL 8.0.27
Windows 10 教育版
Error Code: 1091. Can't DROP 'XXX'; check that column/key exists
笔者非常疑惑,因为多次检查后发现列名似乎并没有错误。和往常一样,笔者为此建立了一个 demo 表,这才发现了原因所在。
建表代码如下:
CREATE TABLE demo1 (
id CHAR(32),
PRIMARY KEY (id)
);
CREATE TABLE demo2 (
id CHAR(32),
demo1_id CHAR(32),
PRIMARY KEY (id),
FOREIGN KEY (demo1_id) REFERENCES demo1 (id)
);
当建立了上述的表之后,笔者尝试删除表 demo2 的外键,代码如下:
ALTER TABLE demo2 DROP FOREIGN KEY demo1_id;
结果发生同样的错误。
Error Code: 1091. Can't DROP 'demo1_id'; check that column/key exists
这个问题出在建表代码和删除外键的代码上。由于在当初建表的时候,没有为这个外键约束起一个名称,所以 MySQL 为此自动生成了一个名称,这个自动生成的名称不同于受到这个外键约束的列名。而删除外键的时候,需要提供的是这个外键约束名,而不是列名。
可以印证这一点。在 Navicat Premium 中可以看到关于这个表的建表信息。(也可以使用代码 show create TABLE demo2;
来查看。)
可以看到,MySQL 自动为列 demo1_id 的外键约束生成了一个名称 demo2_ibfk_1
。因此,删除外键时应使用这个名称。即删除外键的代码应如下:
ALTER TABLE demo2 DROP FOREIGN KEY demo2_ibfk_1;
使用了这个代码之后,表 demo2 的外键就成功被删除了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)