我们知道MySQL 8.0.16 之前存储引擎并不支持check约束,语句中的check(检测约束)语句会被分析,但是不会被执行(分析的原因是为了提高兼容性,以便于从其他SQL服务器导入代码),既然能够分析了,那在创建表的语句中出现check语句,正常不会出现错误。
建表语句:
create table ceshi01(
id int primary key auto_increment comment 'id主键',
name varchar(20) not null unique comment '姓名',
age int check ( age > 0 && age <= 130 )
) comment '用户表';
结果:
> OK
> 时间: 0.454s
通过数据插入操作可知,check并不会产生效果。
插入数据:
insert into ceshi01 values(1,"yumm",140)
结果:
> Affected rows: 1
> 时间: 0.157s
接下来进入主题。
建表语句:
create table ceshi03(
id int primary key auto_increment comment 'id主键',
name varchar(20) not null unique comment '姓名',
age int check ( age > 0 && age <= 130 ) comment '年龄',
status char(1) default '1' comment '状态',
gender char(1) comment '性别'
) comment '用户表';
结果:
> 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'comment '年龄', status char(1) default '1' comment '状态', gender ' at line 4
> 时间: 0s
提示我语法错误,错误的位置就在age那一行,当我去掉其中的一个或者将check语句放在最后,则能够正常创建成功。
建表语句:
create table ceshi03(
id int primary key auto_increment comment 'id主键',
name varchar(20) not null unique comment '姓名',
age int check ( age > 0 && age <= 130 ),
status char(1) default '1' comment '状态',
gender char(1) comment '性别'
) comment '用户表';
====================================================
create table ceshi03(
id int primary key auto_increment comment 'id主键',
name varchar(20) not null unique comment '姓名',
age int comment '年龄',
status char(1) default '1' comment '状态',
gender char(1) comment '性别'
) comment '用户表';
====================================================
create table ceshi03(
id int primary key auto_increment comment 'id主键',
name varchar(20) not null unique comment '姓名',
age int comment '年龄',
status char(1) default '1' comment '状态',
gender char(1) comment '性别',
check ( age > 0 && age <= 130 )
) comment '用户表';
结果都是:
> OK
> 时间: **s
很明显,当创建表的时候,一个列属性中同时出现check和comment,就会出现错误,并且无法建表成功。如果我们是在本地低版本MySQL服务器建表,可以在建表语句中不写check语句;如果是其他SQL服务器导入代码或者一定想要写入check约束,那不妨将check语句写在尾部,这样也可以创建成功。这两个方法我推荐第二种方法,因为MySQL在8.0.16开始支持check约束,数据代码从低版本向高版本迁移的时候,高版本服务器能够识别并执行。
另外补充一点,虽然MySQL低版本不支持check约束,但是我们可以通过enum或者触发器来对数据进行约束,这样也是避免上面问题的一种方法。
以上内容是我在帮人解决问题之后的一个总结,如有不对或不足之处,望留言指教。