分类
- 表级约束
可以约束表中任意一个或多个字段。与列定义相互独立,不包含在列定义中;与定义用 ‘ , ’ 分隔,必须指出要约束的列的名称
- 列级约束
包含在列定义中,直接跟在该列的其他定义之后,用 空格 分隔,不必指定列名
列级约束
主键
主键约束 ( PRIMARY KEY ,缩写 PK ), 用来约束表中的某个字段可以唯一标识一条记录,设置为主键的字段取值不能重复(唯一),也不能为空(非空),可以不连号
通常不用业务字段作为主键,单独给每张表设计一个 id 的字段,把 id 作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的
主键可以是单个字段,也可以是多个字段组合。单字段主键可使用列级约束也可以使用表级约束,多字段主键只能使用表级约束
- 创建主键
CREATE TABLE IF NOT EXISTS test(id INT PRIMARY KEY,name VARCHAR(20),age INT);
INSERT INTO test (id, NAME) VALUES (1, '盾山');INSERT INTO test (id, NAME) VALUES (2, '梦琪');INSERT INTO test (id, NAME) VALUES (3, '鲁班');INSERT INTO test (id, NAME) VALUES (4, '白起');
主键设置后,主键重复和空值的数据就无法插入,因为主键是唯一且不能为空
删除主键
ALTER TABLE test DROP PRIMARY KEY;
主键自增
- 主键自增默认从 1 开始 ,自增的前提必须有主键约束 ```plsql CREATE TABLE IF NOT EXISTS tests( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), age INT );
INSERT INTO tests (name, age) VALUES (‘盾山’, 26); INSERT INTO tests (name, age) VALUES (‘梦琪’, 23); INSERT INTO tests (name, age) VALUES (‘鲁班’, 30); INSERT INTO tests (name, age) VALUES (‘白起’, 45);
INSERT INTO tests VALUES (DEFAULT, ‘李白’, 24); INSERT INTO tests VALUES (NULL, ‘张飞’, 30);
> 如果主键没有设定值,可以用 DEFAULT、NULL 做主键自增效果。- **修改主键自增起始值**```plsqlALTER TABLE tests AUTO_INCREMENT = [num] # num 为自定义起始值
- 设定主键自增起始值
CREATE TABLE IF NOT EXISTS tests(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20),age INT) AUTO_INCREMENT = 100 ;
扩展
- DELETE 删除表中的数据,但不重置 AUTO_INCREMENT 的值
- TRUNCATE 则会重置 AUTO_INCREMENT
唯一
唯一约束 ( UNIQUE ),规定一张表中指定的某个字段的值不能重复。无论单个字段或多个字段唯一约束可以使用列级约束和表级约束添加
字段名 字段类型 UNIQUE
# 创建不重复名字的测试表CREATE TABLE IF NOT EXISTS testss(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20) UNIQUE);INSERT INTO testss (name) VALUES ('kuma');# 再插入下方数据时会提示重复数据不允许插入,因为值重复INSERT INTO testss (name) VALUES ('kuma');# 如果插入多个 NULL 值,看一下结果INSERT INTO testss (name) VALUES (NULL);
检查
检查约束 ( CHECK ) 用于现住址某个字段的取值范围,可以定义为列级或表级约束,MySQL8 开始支持检查约束
非空
非空约束 ( NOT NULL ),规定一张表中指定的某个字段的值不能为空 ( NULL ),且插入数据写 NULL 会报错,无论是单个字段或多个段非空约束的添加只能使用列级约束
字段名 字段类型 NOT NULL
CREATE TABLE IF NOT EXISTS tes(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20) NOT NULL);
默认值
表中添加数据时,如果不指定这个字段的数据,就使用默认值
字段名 字段类型 DEFAULT 默认值
CREATE TABLE IF NOT EXISTS tets(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20) NOT NULL UNIQUE,location VARCHAR(50) DEFAULT 'ADC');# 使用默认值,则无法写对应字段INSERT INTO tets (name) VALUE ('kuma');# 不使用默认值,则需要写上对应字段INSERT INTO tets (name, location) VALUE ('xiya', 'TOP');
综合案例
CREATE TABLE IF NOT EXISTS t_student (sno INT(5) PRIMARY KEY AUTO_INCREMENT ,sname VARCHAR(5) NOT NULL ,sex CHAR(1) DEFAULT '女' CHECK ( sex = '男' OR sex = '女' ) ,age INT(3) CHECK ( age >= 20 AND age <= 50 ) ,enterdate DATE ,classname VARCHAR(10) ,email VARCHAR(15) UNIQUE) DEFAULT CHARSET = UTF8MB4 ;
包含了所有非外键约束的列级约束写法,通过插入不同数据检验约束的作用
表级约束
-- 表级约束常规写法CREATE TABLE t_student (sno INT(4) ,sname VARCHAR(5) ,sex CHAR(1) DEFAULT '女', -- DEFAULT 只能只作为列级约束age INT(3) ,enterdate DATE ,classname VARCHAR(10) ,email VARCHAR(15) ,CONSTRAINT pk_stu PRIMARY KEY (sno) ,CONSTRAINT ck_stu_sex CHECK ( sex = '男' OR sex = '女' ) ,CONSTRAINT ck_stu_age CHECK ( age >= 20 AND age <= 50 ) ,CONSTRAINT uq_stu_email UNIQUE (email)) DEFAULT CHARSET = UTF8MB4 ;
表级约束多用于在创建表以后添加约束
-- 创建无约束的表CREATE TABLE t_student (sno INT(4) ,sname VARCHAR(5) NOT NULL ,sex CHAR(1) DEFAULT '女',age INT(3) ,enterdate DATE ,classname VARCHAR(10) ,email VARCHAR(15)) DEFAULT CHARSET = UTF8MB4 ;-- 添加表约束ALTER TABLE t_student ADD CONSTRAINT pk_stu PRIMARY KEY (sno) ; -- 添加主键ALTER TABLE t_student MODIFY sno INT(4) AUTO_INCREMENT ; -- 添加自增条件ALTER TABLE t_student MODIFY sname VARCHAR(5) NOT NULL ; -- 添加非空约束ALTER TABLE t_student ADD CONSTRAINT ck_stu_sex CHECK ( sex = '男' OR sex = '女' ) ;ALTER TABLE t_student ADD CONSTRAINT ck_stu_age CHECK ( age >= 20 AND age <= 50 ) ;ALTER TABLE t_student ADD CONSTRAINT uq_stu UNIQUE (email) ;-- 查看表结构DESC t_student ;
注意案例中 添加表的 自增 写法
汇总
- 列级约束: 主键、非空、检查、唯一、默认
- 表级约束:主键、非空、检查、唯一
- 自增必须要有主键约束,注意表级约束是自增添加写法
