问题背景
网上也有类似的报错,出现这种报错的原因有很多种,我就说说我遇到的,还没搜到的🏃♂️🏃♂️🏃♂️
我是在写数据库关于数据库完整性那一章的实验报告时遇到的:
参照课本第5章中的例10定义新的学生表S2,为S2中定义的约束进行命名,并用alter table语句去对表S2中已定义的某个约束进行删除操作。
当时书上的例子是这样的:
CREATE TABLE S2(
Sno NUMERIC(6)
CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
Sname VARCHAR(20)
CONSTRAINT C2 NOT NULL,
Ssex NUMERIC(3)
CONSTRAINT C3 CHECK(Sage<30),
Sage CHAR(2)
CONSTRAINT C4 CHECK(Ssex IN ('男','女')),
CONSTRAINT Student_Key PRIMARY KEY (Sno)
);
但是我在Navicat上运行后就报错了:
问题提出
好奇,为什么我不能给完整性约束条件命名呢?😐😐😐
是因为我的MySQL版本太低了吗?(MySQL5.1)
问题解决
然后我就去 MySQL 的官网上查 MySQL5.6 的参考手册,发现关于约束这一块,在 MySQL5.6 的参考手册上就只有这一个外部关键约束:
通过观察,貌似 CONSTRAINT 只能定义外键约束,给外键约束赋别名
所以只能把 CONSTRAINT 去掉,只剩下 CHECK 短语:
CREATE TABLE S2(
Sno NUMERIC(6)
CHECK (Sno BETWEEN 90000 AND 99999),
Sname VARCHAR(20)
NOT NULL,
Ssex NUMERIC(3)
CHECK(Sage<30),
Sage CHAR(2)
CHECK(Ssex IN ('男','女')),
PRIMARY KEY (Sno)
);
这样就可以运行成功了。
而又看了看MySQL8.0参考手册,有了新发现,发现专门有一个检查约束
终于让我找到了原因
我那卑微的5.1向8.0低头了🤦♂️🤦♂️🤦♂️
所以就没法对约束进行操作了。
不过可以删除外键约束,虽然这个表格里没有,不过可以说出方法,去Navicat里面,打开:
可以看出他这个外键约束名是电脑给他的。
语句:ALTER TABLE selectcourse DROP selectcourse_ibfk_1;
2020.7.26更新
我们班的带佬看到我的博客后发现些问题
1.课本上的约束之所以不能定义,是因为 MySQL 的语法中约束命名时要加逗号,见下图
并且,这个 check 约束是个很鸡肋的约束,没有个锤子用,写上不报错,并不能对实际数据进行约束,见下图
2.not null 的约束不能命名,所以课本上会报错
如有问题,请私聊。