MySQL中主要支持以下几种完整性约束,如表所示.其中Check约束是MySQL8中提供的支持.
约束条件约束描述
PRIMARY KEY主键约束,约束字段的值可唯一的标识对应的记录
NOT NULL非空约束,约束字段的值不能为空
UNIQUE唯一约束,约束字段的值是唯一的
CHECK检查约束,限制某个字段的取值范围
DEFAULT默认值约束,约束字段的默认值
AUTO_INCREMENT自动增加约束,约束字段的值自动递增
FOREIGN KEY外键约束,约束表与表之间的关系 /* 建立一张用来存储学生信息的表 字段包含学号,姓名,性别,年龄,入学日期,班级,Email等信息
约束: 建立一张用来存储学生信息列表 字段包含学号,姓名,性别,年龄,入学日期,班级,Email等信息 1.学号是主键 = 不能为空 +
唯一,主键的作用;可以通过主键查到唯一的记录 2.如果主健是整数类型,那么需要自增 3.姓名不能为空 4.Email唯一 5.性别默认值是男
6.性别只能是男女 7.年龄只能在18-50之间 */ -- 创建数据库表 CREATE TABLE t_student( sno INT(6)
PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(5) NOT NULL, sex CHAR(1) DEFAULT '男'
CHECK(sex='男' || sex='女'), age INT(3) CHECK(age>=18 AND age <= 50), enterdate
DATE, classname VARCHAR (10), email VARCHAR(15) UNIQUE ); -- 添加数据 INSERT INTO
t_student VALUES (1,"张三",'男',18,"2023-9-1","java01班","[email protected]"); --
如果主键没有设定值,或者null default都可以完成主键自增的效果 INSERT INTO t_student (sname,enterdate)
VALUES ('菲菲','2022/9/1'); INSERT INTO t_student VALUES
(NULL,"李四",'男',18,"2023-9-1","java01班","[email protected]"); INSERT INTO t_student
VALUES (DEFAULT,"王五",'男',18,"2023-9-1","java01班","[email protected]"); --
如果sql报错,可能主键就浪费了,后续插入是不连号的,我们主键也不要求连号的 INSERT INTO t_student VALUES
(NULL,"小明",'男',18,"2023-9-1","java01班","[email protected]");
约束从作用上可以分为两类:
1.表级约束:可以约束表中任意一个或多个字段.与列定义相互独立,不包含在列定义中;与定义用','分隔;必须指出要约束的列的名称;
2.列级约束:包含在列定义中,直接跟在该列的其它定义之后,用空格分隔;不必指定列名
CREATE TABLE t_student( sno INT(6) AUTO_INCREMENT, sname VARCHAR(5) NOT NULL,
sex CHAR(1) DEFAULT '男', age INT(3), enterdate DATE, classname VARCHAR(10),
email VARCHAR(15), CONSTRAINT pk_stu PRIMARY KEY(sno), CONSTRAINT ck_stu_sex
CHECK(sex ='男' || sex='女'), CONSTRAINT sk_stu_age CHECK(age>=18 AND age<=50),
CONSTRAINT uq_stu_email UNIQUE (email) ); -- 添加数据 INSERT INTO t_student VALUES
(1,'张三','男',51,'2023-9-1','java','[email protected]')
3.在创建表之后添加约束
CREATE TABLE t_student( sno INT(6), sname VARCHAR(5) NOT NULL, sex CHAR(1)
DEFAULT '男', age INT(3), enterdate DATE, classname VARCHAR(10), email
VARCHAR(15) ); -- 错误码: 1075 -- Incorrect table definition; there can be only
one auto column and it must be defined as a key -- 错误的解决办法: 就是auto_increment去掉
-- 添加数据 INSERT INTO t_student VALUES
(1,'张三','男',51,'2023-9-1','java','[email protected]'); -- 在创建表以后添加约束 ALTER TABLE
t_student ADD CONSTRAINT pk_stu PRIMARY KEY(sno); -- 主键约束 ALTER TABLE t_student
MODIFY sno INT (6) AUTO_INCREMENT; -- 修改自增条件 ALTER TABLE t_student ADD
CONSTRAINT ck_stu_sex CHECK(sex='男' || sex='女'); ALTER TABLE t_student ADD
CONSTRAINT ck_stu_age CHECK(age>=18 AND age<=50); ALTER TABLE t_student ADD
CONSTRAINT uq_stu_email UNIQUE(email);