- 表约束的基本概念:
-
表约束:用于确保表中的每一行都有可以唯一识别自己的一列或多列。(这个主键列或列组合不是唯一的,而且通常用于定义表中各行的唯一标识符。比如学号、员工编号等。)
-
主键约束: (主键可以理解为身份证号)
(1)主键列的每个值都唯一 (2)主键列不能为NULL (3)primary key -
主键自增约束——auto_increment
-
唯一约束:
-
非空约束:用于约束该字段的值不能为空(null);
-
外键约束:将两个表用外键联系到一起;
-
外键级联操作:当父表中的记录被删除或者更新的时候,子表中的相关记录也会自动进行相应的删除或更新;
- 创建具有主键约束的表:
-
一般主键约束就放在ID列,ID列就相当于是编号/身份证号,具体操作命令如下:
实操: use YYY; CREATE TABLE student( id int PRIMARY KEY, name varchar(20), age int ); //id int PRIMARY KEY 的作用就是让ID列为表的主键; //接着再在表student中添加数据: INSERT INTO student VALUES (1,'木头人',23),(2,'石头人',24); SELECT * FROM student;
[1]
图中key即表示主键; ID对应的null里写着NO,表示这里的ID不能为空,因为如果ID为空,则不满足主键值唯一的原则;
[2]
-
删除主键:
ALTER TABLE student drop PRIMARY KEY; SELECT * FROM student;
再来查看一下表结构:可以看到,表结构中的key的值已经没有了;
desc student;
- 添加主键: ALTER TABLE student MODIFY id int PRIMARY key;
- 主键自增约束:
-
主键自增约束: CREATE TABLE student2( id int PRIMARY key auto_increment, name VARCHAR(20), age int ); //其中的auto_increment即表示自增 INSERT INTO student2 VALUES (null ,'小明',23),(null,'小李',24);
如图实操所示,添加数据的时候并没有给ID列值,填的是null,但ID值按我们给的顺序自增;
-
删除自增约束:
删除自增约束: ALTER TABLE student2 MODIFY id int ; desc student2;
当我们删除主键自增后再添加数据,ID值为null就不行了,没有主键自增,那我们的ID值要给出来;
INSERT into student2 VALUES (3 ,'x小张',25);
SELECT * FROM student2;
添加主键自增: ALTER TABLE student2 MODIFY id int auto_increment;
SELECT * FROM student2;
desc student2;
-
唯一约束unique:
- 要求列里面的数据必须唯一(即表里面的某一列数据必须唯一),可以为空;
- 一张表可以有多个唯一约束,用于保证不同列或组合的值唯一;
-
添加唯一约束实操:
CREATE TABLE student3( id int PRIMARY KEY auto_increment, name VARCHAR(20), age int UNIQUE ); desc student3; INSERT into student3 VALUES (null,'李芳',21); SELECT * FROM student3; INSERT into student3 VALUES (null,'元芳',21); SELECT * FROM student3; INSERT into student3 VALUES (null,'电子狗',null),(NULL,'电子猪',NULL); SELECT * FROM student3;
(1)创建一个表,设置主键约束和唯一约束[1]
(2)给表中添加数据,将李芳和元芳的年龄age设置成一样的,可以发现元芳的数据填充不进去了,是因为我们给age设置了唯一约束,相同的年龄违反了唯一约束,故而不能填充进去元芳的信息;[2]
(3)如果age不一样,则可以成功填充进去,如图:[3]
(4)但是在唯一约束下,值是可以为null的,如图:[4]
[1]
[2]
[3]
[4]
-
删除/添加唯一约束:
实操: //删除唯一约束(唯一约束在age列,所以用age): ALTER TABLE student3 DROP INDEX age; //添加唯一约束: ALTER TABLE student3 MODIFY age int UNIQUE;
-
在创建表时添加非空约束:
//即在声明的列名的数据类型后面协商not null: CREATE TABLE student4( id int PRIMARY KEY auto_increment, name VARCHAR(20) NOT NULL, age int UNIQUE );
//再填充数据:
INSERT INTO student4 VALUES (null,'李白',18),(null,'陶渊明',19);
SELECT * FROM student4;
可以看到name有非空约束下,name的值不可以为空,值为空null的值我们填充不进去:
但若name这里用引号括起来,'null'就会成为一个字符串,而不是空:
此外要是引号' '里面什么都不放,也是有值的,被视为空字符串,可以填充数据进去(有的数据库不是这样的,但mysql是这样):
-
删除/添加非空约束:
ALTER TABLE student4 MODIFY name VARCHAR(20); SELECT * FROM student4; ALTER TABLE student4 MODIFY name VARCHAR(20) not NULL; SELECT * FROM student4;
- 外键约束:
- 数据库中不止一个表,若数据库中的表都是相互独立的,则存储利用效率很低。
- 实际上很多表之间都是有联系的,比如一对多表关系,一对一表关系,多对多表关系;
- 两个表之间通多ID和UID建立联系;
举例:用户表和订单详情表:
| 用户表 |
| ID | name |
|---|---|
| 1 | 张三 |
| 2 | 李四 |
| 订单详情表 |
| id | number | |
|---|---|---|
| 1 | 60 | 1 |
| 2 | 80 | 1 |
| 3 | 90 | 2 |
| 4 | 100 | 2 |
| (最后一列即为UID) |
订单详情表中的订单信息,UID为1的即为用户表中的ID为1的用户的订单(即张三的订单) UID意思是USER表的ID;
实操:
//创建用户表:
CREATE TABLE user
id int PRIMARY KEY auto_increment,
name VARCHAR(20) not null
)ENGINE=INNODB;
//申明存储引擎,INNODB是mysql默认的存储引擎;
INSERT into user VALUES (null,'张三'),(null,'李四');
SELECT *FROM user;
//填充数据
//创建数据表:
CREATE TABLE orderlist(
id int PRIMARY key auto_increment,
umber VARCHAR(20),
uid int,
CONSTRAINT user_orderlinst FOREIGN KEY (uid) REFERENCES user(id)
)ENGINE=INNODB;
//user_orderlinst是外键名,外键将两个表联系起来;(外键名是自己定义的,想叫什么叫什么)
创建用户表:
给用户表填充数据:
创建订单详情表:
给订单详情表填充数据:
注:如果UID为user表中没有的,则该数据不能被填充到订单表中(如下图):
-
删除外键约束:
ALTER TABLE 后表名 DROP FOREIGN KEY 外键名; ALTER TABLE orderlist DROP FOREIGN KEY user_orderlist; -
建立后表后单独添加外键:
ALTER TABLE 后表名 ADD CONSTRAINT 外键名 FOREIGN KEY (后表关系列名); ALTER TABLE orderlist ADD CONSTRAINT user_orderlist FOREIGN KEY (uid);
- 有外键时是不可以删除表中的内容的:
因为表里面是有外键约束的,所以不能随心所欲地删除;如果想要删除,要把外键约束去掉,才可以删除;
-
外键级联操作:当父表里面的数据被删除或更新的时候,子表中的相关数据也会进行相应的删除或更新;
ALTER TABLE orderlist ADD CONSTRAINT user_orderlist FOREIGN key (uid) REFERENCES user(id) on UPDATE CASCADE on DELETE CASCADE; //添加外键的同时添加外键级联(删除和更新) //效果:更新用户表信息数据,则订单表对应信息数据也会相应改变; //要之前没有外键,才能成功地进行外键级联操作; //外键级联操作后,再删除某个表中的数据,另一个表中的数据也会改变; DELETE from user where name = '李四'; select * FROM user;
可以看到李四的相关信息已经被删除:
再查看订单详情表的数据,可以发现只剩下UID=1的数据: