在创建表时,给表的字段添加相应约束,保证数据的合法性、有效性、完整性。
常见的约束:
非空约束:not null,约束的字段不能为NULL
唯一约束:unique,约束的字段不能重复但可以为NULL。
主键约束:primary key(简称PK),约束的字段既不能为NULL,也不能重复
外键约束:foreign key(简称FK),
非空约束:not null,约束的字段不能为NULL
mysql> drop table if exists t_user;
mysql> create table t_user(
-> id int,
-> username varchar(255) not null,
-> password varchar(255)
-> );
mysql> insert into t_user(id,password) values (1,'123');
ERROR 1364 (HY000): Field 'username' does not have a default value
mysql> insert into t_user(id,username,password) values (1,'ice','coffee');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t_user;
+------+----------+----------+
| id | username | password |
+------+----------+----------+
| 1 | ice | coffee |
+------+----------+----------+
mysql> drop table if exists t_user;
mysql> create table t_user(
-> id int,
-> username varchar(255) unique #添加唯一约束
-> );
mysql> insert into t_user values(1,'coffee');
Query OK, 1 row affected (0.01 sec)
#不能重复
mysql> insert into t_user values(2,'coffee');
ERROR 1062 (23000): Duplicate entry 'coffee' for key 't_user.username'
#可以为空
mysql> insert into t_user (id) values(3);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t_user;
+------+----------+
| id | username |
+------+----------+
| 1 | coffee |
| 3 | NULL |
+------+----------+
#两个字段联合起来不重复
mysql> create table t_user(
-> id int,
-> username varchar(255),
-> usercode varchar(255),
-> unique(username,usercode)
-> );
#这样不会报错
mysql>insert into t_user values(1,'111','coffee');
mysql>insert into t_user values(2,'111','ice');
mysql>insert into t_user values(3,'222','coffee');
#如果是分别写unique。两个字段各自的字段不重复
mysql> create table t_user(
-> id int,
-> username varchar(255) unique,
-> usercode varchar(255) unique
-> );
mysql>insert into t_user values(1,'111','coffee');
#开始报错
mysql> insert into t_user values(2,'111','ice');
ERROR 1062 (23000): Duplicate entry '111' for key 't_user.username'
mysql> insert into t_user values(3,'222','coffee');
ERROR 1062 (23000): Duplicate entry 'coffee' for key 't_user.usercode'
mysql> create table t_user(
-> id int primary key, #添加组件约束
-> username varchar(255),
-> email varchar(255)
-> );
#测试
mysql> insert into t_user(id,username,email) values (1,'zs','[email protected]'),(2,'lis','[email protected]'),(3,'ww','[email protected]');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> insert into t_user(id,username,email) values (1,'ice','[email protected]');
ERROR 1062 (23000): Duplicate entry '1' for key 't_user.PRIMARY'
mysql> insert into t_user(username,email) values ('ice','[email protected]');com');
ERROR 1364 (HY000): Field 'id' doesn't have a default value
表设计的三范式:第一范式要求任意一张表中都应该有主键。
主键作用:主键值作为这行记录在这张表中的唯一标识。
注:一张表的主键约束只能有一个。
根据自然性质划分:
自然主键:这是一个和业务没有任何关系的自然数。
业务主键:和系统业务挂钩,例如银行卡号做主键、身份证号做主键。
mysql提供主键值自增:auto_increment
mysql> drop table if exists t_user;
mysql> create table t_user(
-> id int primary key auto_increment,#表示id字段自动维护一个自增的数字,从1开始以1递增。
-> username varchar(255)
-> );
mysql> insert into t_user(username) values('a');
mysql> insert into t_user(username) values('b');
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | a |
| 2 | b |
【例子】
cno(pk) | cname |
---|---|
101 | 高一1班 |
102 | 高三2班 |
103 | 高三3班 |
sno(pk) | sname | classno(该字段添加外键约束fk) |
---|---|---|
1 | coffee1 | 101 |
2 | coffee2 | 101 |
3 | coffee3 | 102 |
4 | coffee4 | 102 |
5 | coffee5 | 102 |
以上中:t_student中的classno字段引用t_class表中cno字段,此时t_student表叫做子表,t_class表叫做父表。
在创建时或插入数据时,应先创建父表再创建子表。
删除表或删除数据时,先删子表再删除父表。
语法格式:foreign key(本表字段) references 父表(父表字段)
注意:父表字不一定是主键,但至少具有unique约束。
#先删子表
mysql> drop table if exists t_student;
#再删父表
mysql> drop table if exists t_class;
#先创建父表
mysql> create table t_class(
-> cno int,
-> cname varchar(255),
-> primary key(cno)
-> );
#创建子表
mysql> create table t_student(
-> sno int,
-> sname varchar(255),
-> classno int,
-> primary key(sno),
-> foreign key(classno) references t_class(cno)
-> );
#先插入父表数据
mysql> insert into t_class values('101','高一1班'),('102','高一2班'),('103','高一3班');
mysql> select * from t_class;
+-----+------------+
| cno | cname |
+-----+------------+
| 101 | 高一1班 |
| 102 | 高一2班 |
| 103 | 高一3班 |
+-----+------------+
#再插入子表数据
mysql> insert into t_student values(1,'coffee1','101'),(2,'coffee2','101'),(3,'coffee3','102'),(4,'coffee4','102'),(5,'coffee5','102');
mysql> select * from t_student;
+------+---------+---------+
| sno | sname | classno |
+------+---------+---------+
| 1 | coffee1 | 101 |
| 2 | coffee2 | 101 |
| 3 | coffee3 | 102 |
| 4 | coffee4 | 102 |
| 5 | coffee5 | 102 |
+------+---------+---------+
#插入父表没有的classno,不能添加子记录。
mysql> insert into t_student value(6,'coffee6','104');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`studytest`.`t_student`, CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))
#外键可以为null
mysql> insert into t_student value(7,'coffee7',null);
mysql> select * from t_student;
+------+---------+---------+
| sno | sname | classno |
+------+---------+---------+
| 1 | coffee1 | 101 |
| 2 | coffee2 | 101 |
| 3 | coffee3 | 102 |
| 4 | coffee4 | 102 |
| 5 | coffee5 | 102 |
| 7 | coffee7 | NULL |
+------+---------+---------+
学习视频:动力节点MySQL基础入门到精通