1.约束
Q:什么是约束?常见的约束有哪些呢?
A:在创建表的时候,可以给表的字段增加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。
常见的约束有哪些呢?
非空约束 (not null):约束的字段不能为null
唯一约束 (unique):约束的字段不能重复
主键约束 (primary key):约束的字段既不能为NULL,也不能重复
外键约束 (foreign key):...(见之后学习笔记)
检查约束 (check):oracle有,但是mysql不支持。
案例:给两个列或多个列增加unique
create table t_user {
id int;
usercode varchar(255),
username varchar (255),
unique (usercode,username) //表级约束
};//联合起来不唯一
create table t_user {
id int;
usercode varchar(255)unique,
username varchar (255)unique //列级约束
}//均不能唯一
NOT NULL只有列级约束,没有表级约束。
主键约束相关的术语:
主键约束:primary key
主键字段: id字段添加
主键值:id字段中的每一个值都是主键值
主键有什么作用?
表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键。
主键的作用:主键值是这行记录在这条表中的唯一标识。
一张表的主键约束只能有一个(必须记住)
mysql 提供主键值自增
auto_increment
外键约束:
关于外键约束的相关术语:
外键约束:foreign key
外键字段:添加有外键的字段
外键值:外键字段中的每一个值
业务背景:
请设计数据库表,用来维护学生和班级的信息?
第一种方案:一张表存储所有数据
no(pk) name classno classname
-----------------------------------------------------------
1 zs1 101 河南省平顶山市舞钢市垭口一高高三1班
2 zs2 101 河南省平顶山市舞钢市垭口一高高三1班
3 zs3 102 河南省平顶山市舞钢市垭口一高高三2班
4 zs4 102 河南省平顶山市舞钢市垭口一高高三2班
5 zs5 102 河南省平顶山市舞钢市垭口一高高三2班
缺点:冗余。【不推荐】
第二种方案:两张表(班级表和学生表)
t_class 班级表
cno(pk) cname
-------------------------------------------------------------
101 河南省平顶山市舞钢市垭口一高高三1班
102 河南省平顶山市舞钢市垭口一高高三2班
t_student 学生表
sno(pk) sname classno(该字段添加外键约束fk)
-----------------------------------------------------------
1 zs1 101
2 zs2 101
3 zs3 102
4 zs4 102
5 zs5 102
* 将以上表的建表语句写出来:
t_student中的classno字段引用t_class表中的cno字段,此时t_student表叫做子表。t_class表叫做父表。
删除数据的时候,先删除子表,再删除父表。
添加数据的时候,先添加父表,再添加子表。
创建表的时候,先创建父表,再创建子表。
删除表的时候,先删除子表,再删除父表。
drop table if exists t_student;
drop table if exists t_class;
create table t_class(
cno int,
cname varchar(255),
primary key(cno)
);
create table t_student(
sno int,
sname varchar(255),
classno int,
primary key(sno),
foreign key(classno) references t_class(cno)
);
insert into t_class values(101,'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
insert into t_class values(102,'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy');
insert into t_student values(1,'zs1',101);
insert into t_student values(2,'zs2',101);
insert into t_student values(3,'zs3',102);
insert into t_student values(4,'zs4',102);
insert into t_student values(5,'zs5',102);
insert into t_student values(6,'zs6',102);
select * from t_class;
select * from t_student;
insert into t_student values(7,'lisi',103); //编译错误,引用的103,父表中没有该字段!
ERROR 1452 (23000) : Cannot add or update a child row :aforeign key constraint fails (bjpowernode INT YT......)
* 外键值可以为NULL?
外键可以为null。
* 外键字段引用其他表的某个字段的时候,被引用的字段必须是主键吗?
注意:被引用的字段不一定是主键,但至少是具有unique约束,具有唯一性,不可重复!