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约束,具有唯一性,不可重复!
浙公网安备 33010602011771号