约束:
约束对应的英语单词: constraint
在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性、有效性!
约束的作用就是为了保证:表中的数据有效!
约束包含:
①非空约束: not null
②唯一性约束: unigue
③主键约束: primary key(简称PK)
④外键约束: foreign key (简称FK)
⑤检查约束: check (mysql不支持,oracle支持)
(一)非空约束:not null
非空约束约束的字段不能NULL。
语法:建表时在字段和数据类型后面加上约束
create table 表名(
字段名 数据类型 not null,
...
...);
案例:
create table room4(
id bigint not null,
name varchar(20) not null,
sex char(10) not null);
创建成功能看到表的结构,各字段数据都不能为空:
所以插入必须完整的插入,想插入空数据便会报错,除非已经指定过默认值:
都是非空的条件下输入成功:
(二)唯一性约束:unique
唯一性约束unique约束的字段不能重复,但是可以为NULL。
(1)单字段独立唯一性(列级约束)
即建表时对某个字段进行约束,只会影响这一个字段。
案例:建一个人员表,id不能重复
create table room(
id bigint unique,
name varchar(20) not null,
sex char(10) not null);
建好之后插入数据进行测试:
insert into room values(2206210738,'dog','男');
insert into room values(2206210738,'cat','女');
报错:重复输入相同的id
但是都是null的情况是都可以的:
(2)多字段联合唯一性(表级约束):
多字段联合唯一性即多个字段都内容都得一样才会报错。
案例:创建一个人员信息表:
create table person(
id bigint,
name varchar(255) unique,
email varchar(255) unique);
但是这里张三有两个不同邮箱都要保存:
insert into person values(2206210738,'zhangsan','zhangsan@qq.com');
insert into person
values(2206210748,'zhangsan','zhangsan@123.com');
这里明显就会报错,因为各自字段后加唯一性约束,张三也不能重复。
所以真正的建表语句应该这么写:
create table person(
id bigint unique,
name varchar(255) ,
email varchar(255),
unique(id,name,email));
这里创建在进行插入:
即可成功
(3)not null 和unique联合
两者是可以连用的,但是not null只有列级约束,没有表级约束。
案例:
create table person(
id bigint not null unique,
name varchar(255) unique,
email varchar(255) unique);
在mysql,联合使用后,非空且唯一会使该字段成为主键(PRI)字段:
(三)主键约束:primary key
主键约束:就是一种约束。
主键字段:该字段上添加了主键约束,这样的字段叫做主键字段。
主键值:主键字段中的每一个值都叫做:主键值。
什么是主键?有啥用?
主键值是每一行记录的唯一标识。
主键值是每一行记录的身份证号! ! !
任何一张表都应该有主键,没有主键的表是无效的。
语法案例:
create table t_room(
t_id bigint primary key,
t_name varchar(20) unique,
t_sex char(10) unique);
当然和前面一样,当吧primary key添加到字段后面是列级约束,把primary key添加到语句后面为表级约束。
create table t_room(
t_id bigint primary key,
t_name varchar(20) unique,
t_sex char(10) unique,
primary key(id,name));
区别:表级约束主要是给多个字段联合起来添加约束,一个字段做主键是单一主键,多个字段是复合主键,和unique的作用是一样的。
两者对比:
结论:一张表,主键约束只能添加1个,主键只能有1个。
主键值建议使用:int、bigint、char等类型.
不建议使用: varchar来做主键。主键值一般都是数字,一般都是定长的。
主键还可以进行:
自然主键
:主键值是一个自然数,和业务没关系。
业务主键
:主键值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键!
业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动的时候可能会影响到主键值,所以业务主键不建议使用。尽使用自然主键。
在mysql中有一种机制可以自动维护一个主键值:auto_increment.
案例:
create table room3(
-> id int primary key auto_increment,
-> name varchar(255));
能看到当重复插入时,mysql会按照自增的方式从1开始,以1递增,自动排号。
(四)外键约束:foreign key
外键约束:一种约束(foreign key)
外键字段:该字段上添加了外键约束.
外键值:外键字段当中的每一个值。
当一个字段没有任何约束的时候,可能会导致数据无效。可能出现一个不相关数据,为了保证数据都是正确有效的,需要给字段添加外键约束。
删除表的顺序?
先删子表,再删父表。
创建表的顺序?
先创建父,再创建子。
删除数据的顺序?
先删了子,再删父.
插入数据的顺序?
先插入父,再插入子。
案例:建立班级表和学生表,两个表通过班级号对应起来。
//班级表
create table t_class(
class_num int primary key, //班级号
class_name char(10) not null, //班级名称
class_person int); //班级人数
//学生表
create table t_tudent(
-> t_id int primary key auto_increment, //学生学号
-> t_name varchar(20) not null, //学生姓名
-> t_class int, //学生所在班级号
-> foreign key(t_class) references t_class(class_num)); //外键约束语法
当对班级号进行约束之后:
mysql> insert into t_class values(1,'高一一班',30);
Query OK, 1 row affected (0.44 sec)
mysql> insert into t_class values(2,'高一二班',30);
Query OK, 1 row affected (0.40 sec)
mysql> insert into t_class values(3,'高一三班',30);
但是向学生表中插入数据时便会报错:无法向子记录插入或更新,因为已经进行外键约束。
mysql> insert into t_tudent values(111,'爱过的吴京',1);
Query OK, 1 row affected (0.42 sec)
mysql> insert into t_tudent values(112,'爱国的吴京',6);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test_wl`.`t_tudent`, CONSTRAINT `t_tudent_ibfk_1` FOREIGN KEY (`t_class`) REFERENCES `t_class` (`class_num`))
因为班级号为6的班级在班级表中并不存在,所以学生表中也无法进行插入,即保证数据的有效性。
这里需要注意的是:
字表中的外键引用的不一定是父表中的主键,但是一定要有唯一性约束,不能重复。