约束(重要!!!)
约束:在创建表时给表中的字段加上一些约束,来保证表中数据的完整性,有效性
类型:
非空约束:not nul
唯一性约束:unique
主键约束:primary key (简称PK)
外键约束:foreign key (简称FK)
检查约束:check (mysql不支持,oracle支持)
-
非空约束:not nul
约束的字段不能为空(NULL)
not null只有列级约束,没有表级约束
例:
drop table if exists t_vip;
create table t_vip(
id int,
name varchar(255) not null
);
insert into t_vip(id,name) values(1,'zhangsan');
insert into t_vip(id,name) values(2,'lisi');
有了非空约束,加入字段值为空就会报错
insert into t_vip(id) values(3);
-
唯一性约束:unique
约束的字段不能重复,但是可以为NULL
drop table if exists_vip
create table t_vip(
id int,
name varchar(255) unique,
enail varchar(255)
);
insert into t_vip (id,name,email) values (1,'zhangsan','zhangsan@123.com');
insert into t_vip (id,name,email) values (2,'lisi','lisi@123.com');
insert into t_vip (id,name,email) values (3,'wangwu','wangwu@123.com');
insert into t_vip (id,name,email) values
(4,'wangwu','wangwu@sina.com'); //插入‘wangwu’重复,报错
-
列级约束,约束直接加在列后面的
create table t_vip{
id int,
name varchar(255) unique,
email varchar(255) unique
}; -
表级约束,约束没有添加在列后面,
name和email两个字段联合起来唯一性
使用场景:需要给多个字段联合起来添加某一约束的时候,需要使用表级约束
create table t_vip{
id int,
name varchar(255),
email varchar(255),
unique(name,email)
};
insert into t_vip (id,name,email) values (1,'zhangsan',zhangsan@123.com);
insert into t_vip (id,name,email) values (2,'zhangsan',zhangsan@sina.com);
这两条都能加入,因为name和email联合起来不相同
unique和not null联合使用
create table t_vip{
id int,
name varchar(255) not null unique
};
在mysql中,一个字段被not null 和 unique 联合约束后,自动变成成主键字段。(oracle不一样)
insert into t_vip(id,name) values (1,'zhangsan');
insert into t_vip(id,name) values (2,'zhangsan'); //错误,name重复
insert into t_vip(id) values (2); //错误,name不能为NULL
-
主键约束 (primary key,简称pk)重要!!!
主键约束:约束名
主键字段:添加了主键约束的字段
主键值:主键字段中的每个值都要做主键值
作用:
主键值是每一行记录的唯一标识。
实际开发中两条记录可能一样,需要通过主键值来区分
(相当于人员表中两个人姓名,性别一样,需要靠身份证区别)
任何一张表都应该有主键。没有主键,表无效!
主键特征:not null + unique(主键值不能是NULL,同时也不能重复!!!)
一个字段做主键叫:单一主键
写法一:
drop table if exists t_vip;
create table t_vip{
id int primary key,
name varchar(255)
};
写法二:
drop table if exists t_vip;
create table t_vip{
id int,
name varchar(255),
primary key(id) //表级约束
};
insert into t_vip(id,name) values(1,'zhangsan');
insert into t_vip(id,name) values(2,'lisi');
insert into t_vip(id,name) values(2,'wangwu'); //错误,不能重复
insert into t_vip(name) values('zhaoliu'); //错误,不能为空
表级约束主要是给多个字段联合起来添加约束,
多个字段联合起来做主键叫:复合主键
PS:实际开发中不建议使用复合主键
主键存在的意义就是单条记录的身份证号,意义达到即可
drop table if exists t_vip;
create table t_vip{
id int,
name varchar(255),
email varchar(255),
primary key(id,name) //表级约束
};
insert into t_vip(id ,name,email) values(1,'zhangsan','zhangsan@123.com');
insert into t_vip(id ,name,email) values(1,'lisi','lisi@123.com');
一张表主键约束只能添加一个
主键值建议使用:
int
bigint
char
等类型
不建议使用:varchar。主键值一般是定长的数字
主键除了按单一主键和复合主键分类之外,
还可以按
自然主键:主键值是一个自然数,跟业务没关系
业务主键:主键值和业务紧密关联,例如拿银行卡号做主键值
实际开发中使用自然主键比较多,因为主键只要做到不重复就行,不需要有意义,
业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动时,可能会影响到主键值
mysql中,有一种机制,可以帮助我们自动维护一个主键值
drop table if exists t_vip;
create table t_vip{
id int primary key auto_increment, //自增
name carchar(255)
};
insert into t_vip(name) values ('zhangsan');
insert into t_vip(name) values ('zhangsan');
insert into t_vip(name) values ('zhangsan');
...
主键可以采用自增的方式生成:auto_increment,从1开始
外键约束(foreign key,简称FK)非常重要!!!!!!
外键约束:foreign key
外键字段:该字段上添加了外键约束
外键值:外键字段当中的每一个值
业务背景:
例:设计数据库表,来描述“班级和学生”的信息
方法一:班级和学生存储在一张表中(失败)
t_student
no(pk) | name | classno | calssname |
---|---|---|---|
1 | jack | 100 | 北京市大兴区亦庄镇第二中学高三1班 |
2 | lucy | 100 | 北京市大兴区亦庄镇第二中学高三1班 |
3 | lilei | 100 | 北京市大兴区亦庄镇第二中学高三1班 |
4 | hanmeimei | 101 | 北京市大兴区亦庄镇第二中学高三2班 |
5 | zhangsan | 101 | 北京市大兴区亦庄镇第二中学高三2班 |
6 | lisi | 101 | 北京市大兴区亦庄镇第二中学高三2班 |
7 | wangwu | 101 | 北京市大兴区亦庄镇第二中学高三2班 |
8 | zhaoliu | 101 | 北京市大兴区亦庄镇第二中学高三2班 |
缺点:数据冗余,空间浪费
方法二:班级一张表,学生一张表
t_class:班级表 (父表)
classno(pk) | calssname |
---|---|
100 | 北京市大兴区亦庄镇第二中学高三1班 |
101 | 北京市大兴区亦庄镇第二中学高三2班 |
t_student:学生表 (子表)
no(pk) | name | cno(FK,引用t_class这张表的classno) |
---|---|---|
1 | jack | 100 |
2 | lucy | 100 |
3 | lilei | 100 |
4 | hanmeimei | 100 |
5 | zhangsan | 101 |
6 | lisi | 101 |
7 | wangwu | 101 |
8 | zhaoliu | 101 |
当cno字段没有约束时,可能会导致数据无效,可能出现102,但102班级不存在,
所以为了保证cno字段中的值都是100和101,需要给cno字段添加外键约束,
cno字段是外键字段,cno字段中的每一个值都是外键值
删表顺序:先删子表,再删父表
建表顺序:先建父表,再建子表
删除数据:先删子,再删父
插入数据:先插父,再插子
drop table if exists t_student;
drop table if exists t_class;
create table t_class(
classno int primary key,
classname varchar(255)
);
create table t_student(
no int primary key auto_increment,
name varchar(255),
cno int,
foreign key (cno) references t_class(classno)
);
insert into t_class (classno,classname) values(100,'北京市大兴区亦庄镇第二中学高三1班');
insert into t_class (classno,classname) values(101,'北京市大兴区亦庄镇第二中学高三2班');
insert into t_student (name,cno) values('jack',100);
insert into t_student (name,cno) values('lucy',100);
insert into t_student (name,cno) values('lilei',100);
insert into t_student (name,cno) values('hanmeimei',100);
insert into t_student (name,cno) values('zhangsan',101);
insert into t_student (name,cno) values('lisi',101);
insert into t_student (name,cno) values('wangwu',101);
insert into t_student (name,cno) values('zhaoliu',101);
子表中的外键引用父表中的某个字段,被引用的这个字段不一定是主键,但至少又unique约束(否则不知道用的是哪个)
外键值可以为NULL
网友评论