1,约束(Constraint)
1.1,什么是约束?常见的约束有哪些?
在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。
常见的约束:
非空约束(not null):约束的字段不能为NULL
唯一约束(unique):约束的字段不能重复
主键约束(primary key):约束的字段不既不能为NULL,也不能重复(简称PK)
外键约束(foreign key):...(简称FK)
检查约束(check):注意Oracle数据库有check约束,目前mysql不支持该约束。
1.2,非空约束 not null
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(123,'123456');
// ERROR 1364 (HY000): Field 'username' doesn't have a default value
insert into t_user values(1234,'xiaohua','233333');
1.3,唯一性约束(unique)
唯一约束修饰的字段具有唯一性,不能重复,但可以为NULL。
drop table if exists t_user;
create table t_user(
id int,
username varchar(255) unique,
password varchar(255)
);
// 不能重复
insert into t_user values(1234,'xiaohua','233333');
insert into t_user values(1234,'xiaohua','233333');
// ERROR 1062 (23000): Duplicate entry 'xiaohua' for key 't_user.username'
//可以为NULL。
insert into t_user(id) values(2);
insert into t_user(id) values(3);
insert into t_user(id) values(4);
给2个列或多个列添加unique
unique(usercode,username);表示usercode,username两个字段联合起来不能重复;【表级约束】
drop table if exists t_user;
create table t_user(
id int,
usercode varchar(255),
username varchar(255),
unique(usercode,username)
);
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.usercode'
unique出现usercode,username等字段后面是给字段添加唯一性约束【列级约束】
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'
1.4,主键约束:(一张表的主键约束只能有一个)
primary key主键约束:不能重复,也不能为NULL。
列级主键约束写法:字段 字段类型 primary key
标记主键约束写法:primary key(字段1,字段2,...)
drop table if exists t_user;
create table t_user(
id int primary key,
username varchar(255) unique,
email varchar(255)
);
insert into t_user values(1,'zs','zs@123.com');
insert into t_user values(2,'ls','ls@123.com');
insert into t_user values(3,'zsl','zsl@123.com');
select * from t_user;
insert into t_user 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。
主键的作用:
表的设计三范式中,第一范式就是要求任何一张表都应该有主键。
主键值是这行记录在这张表当中的唯一标识。
主键的分类
根据主键字段的字段数量来划分:
单一主键:推荐使用,常用的
复合主键:多个字段联合起来添加一个主键约束(不建议使用,复合主键违背三范式)
根据主键的性质来划分:
自然主键:主键值最好就是一个和业务没有任何关系的自然数。
业务主键:主键值和系统的业务挂钩,例如:银行卡卡号,身份证号。 不建议使用,因为以后的业务一旦发生改变,
主键可能也需要随着发生改变,但有时候没办法改变,因为改变可能会导致主键值重复。
mysql提供的主键值自增长:
auto_increment:设置一个主键自增长,从1开始,以1递增.
drop table if exists t_user;
create table t_user(
id int primary key auto_increment,
username varchar(255)
);
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;
1.5,外键约束
关于外键约束的相关术语:
外键约束:foreign key
外键字段:添加有外键约束的字段
外键值:外键字段中的每一个值。
外键可以为NULL
外键引用其他表字段的时候,被引用的字段不一定是主键,但只要要有唯一性(unique)约束。
业务场景:请设计数据库表,用来维护学生和班级信息:
设计两张表(班级表和学生表):
班级表(t_class)包含信息:
cno:(pk主键)班级编号
cname:班级名称
学生表(t_student)包含信息:
sno:(pk主键) 学生学号
sname:学生名字
classno:(fk主键) 班级编号,引用t_class表中的cno字段。
以上两张表:t_student中的classno字段引用t_class表中的cno字段,所以t_student是字表,t_class是父表。
操作字表与父表的顺序要求:
删除数据时,先删字表,再删父表;
添加数据时,先添父表,再添字表;
创建表时,先创父表,在创字表;
删除表时,先删字表,再删父表。
开始sql编写:
drop table if exists t_student;
drop table if exists t_class;
create table t_class(
cno int primary key,
cname varchar(255)
);
create table t_student(
sno int primary key,
sname varchar(255),
classno int,
foreign key(classno) references t_class(cno)
);
insert into t_class values(101,'实验中学高一班');
insert into t_class values(102,'实验中学高二班');
insert into t_student values(10001,'马小虎',101);
insert into t_student values(10002,'张小龙',101);
insert into t_student values(10003,'刘红',102);
insert into t_student values(10004,'李思思',102);
insert into t_student values(10005,'jack',102);
insert into t_student values(10006,'kitty',103);
// ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`sqltest`.`t_student`, CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))
外键可以为NULL
insert into t_student(sno,sname) values(10007,'外键可以为null');
2,存储引擎
查看当前mysql支持的存储引擎
show engines \G
2.1什么是存储引擎
存储引擎这个名字只有在mysql中使用,(Oracle中有对应的机制,就是”表的存储方式“)
上篇:③MySQL之DML(数据操作语言)、DDL(数据定义语言)
下篇:⑤MySQL之约束二