1、什么是约束?常见的约束有哪些呢?
在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表 中数据的合法性。有效性、完整性。
常见的约束有哪些呢?
非空约束(not null):约束的字段不能为NULL
唯一约束(unique):约束的字段不能重复
主键约束(primary key):约束的字段既不能为NULL,也不能重复(简称PK)
外键约束(foreign key):。。。。(简称FK)
检查约束(check):注意oracle数据库有check约束,但是mysql没有,目前mysql 不支持改约束
非空约束 (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,password) values(1,’123’);
ERROR 1364 (HY000): Field ‘username’ doesn’t have a default value
insert into t_user(id,username,password) values(1,’lisi’,’123’);
唯一性约束(unique)
唯一约束修饰的字段具有唯一性,不能重复。但可以为null
案例:给某一列添加unique
drop table if exists t_user;
create table t_user(id int, username varchar(255) unique);//列级约束y
insert into t_user values(1,’zhangsan’);
insert into t_user values(2,’zhangsan’);
ERROR 1062 (23000): Duplicate entry ‘zhangsan’ for key ‘t_user.username’
案例:给两个列或者多个列添加unique
drop table if exists t_user;
create table t_user(id int,userode varchar(255), username varchar(255), unique(usercode,username) );//多个字段联合起来添加一个约束unique【表级约束】
insert into t_user values (1,’111’,’zs’);
insert into t_user values (2,’111’,’ls’);
insert into t_user values (3,’222’,’zs’);
select * from t_user;
insert into t_user values (3,’111’,’zs’);
ERROR 1062 (23000): Duplicate entry ‘111-zs’ for key ‘t_user.userode’
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’,’zs’);
insert into t_user values (2,’111’,’ls’);
ERROR 1062 (23000): Duplicate entry ‘111’ for key ‘t_user.usercode’
注意:not null约束只有列级约束。没有表级约束。
主键约束
怎么给一张表添加主键约束?
drop table if exists t_user;
create table t_user(id int primary key,username varchar(255),email varchar(255));// 列 级约束
insert into t_user(id,username,email) values(1,’zs’,’zs@123.com’);
insert into t_user(id,username,email) values(2,’ls’,’ls@123.com’);
insert into t_user(id,username,email) values(3,’ww’,’ww@123.com’);
select * from t_user;
+——+—————+——————+
| id | username | email |
+——+—————+——————+
| 1 | zs | zs@123.com |
| 2 | ls | ls@123.com |
| 3 | ww | ww@123.com |
+——+—————+——————+
insert into t_user(id,username,email) values(1,’jack’,’jack@123.com’);
ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘t_user.PRIMARY’
insert into t_user(username,email) values(‘jack’,’jack@123.com’);
ERROR 1364 (HY000): Field ‘id’ doesn’t have a default value
根据以上的测试得出:id是主键,是因为添加了主键约束。
主键的特点:不能为NULL,也不能为重复。
主键相关的术语?
主键约束:primary key
主键字段:id字段添加primary key之后,id叫主键字段
主键值:id字段中的每一个值都是主键值。
主键有什么作用?
表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键。
主键的作用:主键值是这行记录在这张表当中的唯一标识(就像人的身份证号一样)
主键的分类
根据主键字段的数量来划分:
单一主键 (推荐的,常用的。)
复合主键(多个字段联合起来添加一个主键约束)(不建议使用,违背三范式)
根据主键性质来划分:
自然主键:主键值最好就是一个和业务没有任何关系的自然数(推荐)
业务主键:主键值和系统的业务挂钩,例如:拿银行卡号做主键,拿身份证做主键(不推荐使用)
最好不要拿着和业务挂钩的字段作为主键。因为以后一旦发生改变 的时候,主键值可能也需要随着发生变化,但有的时候没有办法变化,因为变化可能导致主键值重复
一张表的主键约束只能有一个。(必须记住)
使用表级约束方式定义主键:
drop table if exists t_user;
create table t_user(id int,username varchar(255), primary key(id));
insert into t_user(id,username) values(1,’zs’);
insert into t_user(id,username) values(2,’ls’);
insert into t_user(id,username) values(3,’ww’);
select * from t_user;
insert into t_user(id,username) values(3,’cs’);
ERROR 1062 (23000): Duplicate entry ‘3’ for key ‘t_user.PRIMARY’
主键值自增(非常重要)auto_increment
drop table if exists t_user;
create table t_user(id int primary key auto_increment,username varchar(255));
//id字段自动维护一个自增的数字,从1开始,以1递增。
insert into t_user(username) values(‘a’);
insert into t_user(username) values(‘b’);
insert into t_user(username) values(‘c’);
insert into t_user(username) values(‘d’);
insert into t_user(username) values(‘e’);
select * from t_user;
外键约束
关于外键约束的相关术语:
外键约束:foreign key
外键字段:添加有外键约束的字段
外键值:外键字段中的每一个值
业务背景:
请设计数据库表,用来维护学生和班级的信息?
第一种方案:一张表存储所有数据
no(pk) name classno classname
—————————————————————————————————-
1 zs1 101 xxx高三一班
2 zs2 101 xxx高三一班
3 zs3 102 xxx高三二班
4 zs4 102 xxx高三二班
5 zs5 102 xxx高三二班
缺点:冗余。【不推荐】
第二种方案:两张表(班级表和学生表)
t_class班级表
con(pk) cname
———————————————————
101 xx高三一班
102 xx高三二班
t_student 学生表
sno(pk) sname cno(改字段添加外键约束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,’XXXXXXXXXXX’);
insert into t_class values(102,’YYYYYYYYYYY’);
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’);
select from t_class;
select from t_student;
insert into t_student values(6,’lisis’,’103’);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (pjq.t_student, CONSTRAINT t_s<br />tudent_ibfk_1 FOREIGN KEY (classno) REFERENCES t_class (cno))
外键值可以为null?
外键可以为null
外键字段引用其他表的某个字段的时候,被引用的字段必须是主键吗?
注意:被引用的字段不一定是主键,但至少具有unique约束。
