1.约束
1.1 什么是约束? 常见的约束有哪些?
注意:比如注册一个新的用户,底层就相当于执行一次insert语句
在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。
常见的约束有哪些 ?
- 非空约束 (not null) : 约束的字段不能为 NULL
- 唯一性 (unique) : 约束的字段不能重复
- 主键约束 (primary key) : 约束的字段既不能为NULL,也不能重复(简称pk)
- 外键约束 (foreign key) : ...(简称FK)
- 检查约束 (check) : 注意oracle数据库有check约束,但是mysql没有,目前mysql不支持该约束。
1.2非空约束 (not null)
第一步 :创建一个新的表
drop table if exists t_user; create table t_user( id int, username varchar(255) not null, password varchar(255) ); 复制代码
第二步 : 向表中插入数据
insert into t_user(id,username,password) values(1,'zhangsan','123');
第三步 :查看表的数据
select * from t_user;
错误案例 :
insert into t_user(id,password) values(1,'444');
注意 :
错误原因,在创建表的时候已经声明username不能为null
查看表的结构可以发现,在username字段的NULL为NO,说明username必须有值,不能为null
desc t_user;
1.3唯一性约束 (unique)
1.3.1 唯一性约束修饰的字段具有唯一性,不能重复,但可以为NULL
1.3.2 案列 :给一个字段(列)加约束条件
第一步 :判断是否存在t_user表,如果存在将整个表删除并创建一个新的表,使用的是 drop table if exists t_user; create table t_user( id int, username varchar(255) unique );
第二步 : 插入数据
insert into t_user values(1,'zhangsan'); insert into t_user values(2,'zhangsan');
注意:
- 第一条语句可以插入成功,但是执行第二条语句插入失败,错误原因:
- 第二条语句中的username字段的值与第一条语句中username的值一样,报错
- 因为在建表的时候username字段加入了约束条件,该字段的值不能重复。
第三步 : 查看表的结构
desc t_user;
注意 : 查看表结构的时候发现,表结构中的username中的Key字段有UNI关键字,说明这个字段的值不能重复。
1.3.3 username可以为NULL
第一步 :插入数据,不给定username的值,默认值为NULL(空)
insert into t_user(id) values(2); insert into t_user(id) values(3); insert into t_user(id) values(4);
第二步 : 查看表的数据
select * from t_user;
1.3.4给多个字段(列)加约束条件
1.3.4.1表级约束 多个字段联合起来添加一个约束unique
第一步 :判断是否存在t_user表,如果存在将整个表删除并创建一个新的表
重点 :
- 这样的语法格式,代表将usercode与username合并为一个字段,使用的是一个约束条件,
- 即只有当usercode与username的字段值都与上一次的字段值相同值相同时,才会报错,当作同一个数据。
drop table if exists t_user; create table t_user( id int, usercode varchar(255), username varchar(255), unique(usercode,username) );
第二步 : 插入数据
insert into t_user values(1,'111','zhangsan'); insert into t_user values(2,'111','wangwu'); insert into t_user values(3,'222','zhangsan');
第三步 :查看表的结构
desc t_user;
注意 : 此时即表级约束中,发现usercode与username中只有usercode中的Key字段都为UNI;而username不为UNI,此时他两是绑在一起的。
第四步 : 查看表中的数据
select * from t_user;
第五步 : 插入重复的数据
insert into t_user values(4,'111','zhangsan');
注意:此时会报错(usercode”键的重复条目“111 zhangsan),因为插入的数据与第一次插入的数据usercode字段值和username字段值都一样.
1.3.4.2 列级约束 各自管自己的,只有当约束的字段值全不重复的时,才会成功,不会报错。
第一步 :判断是否存在t_user表,如果存在将整个表删除并创建一个新的表
重点 :
- 这样的语法格式,代表将usercode与username各为一个字段,使用的是两个个约束条件,
- 即当usercode与username的字段值只要有一个不一样的时候就会报错。
drop table if exists t_user; create table t_user( id int, usercode varchar(255) unique, username varchar(255) unique );
第二步 : 插入数据
insert into t_user values(1,'111','zhangsan'); insert into t_user values(2,'222','wangwu'); insert into t_user values(2,'111','wangwu'); insert into t_user values(3,'222','zhangsan');
注意 :
- 此时只有1行与2行的数据插入成功,因为前两行usercode与username的字段值都不行同
- 而后来两行数据中,usercode与username的字段值其中有一个字段是重复的,报错
第三步 :查看表的结构
desc t_user;
注意 : 此时即列级约束中,发现usercode与username中的Key字段都为UNI;
第四步 : 查看表中的数据
select * from t_user;
注意 :只有前两行数据,后边的两行插入失败,因为有重复。