续2.6 表约束
-
定义:通过限制可以插入到表中的数据类型和格式,来保护数据的完整性和一致性。约束还可以防止无效的数据进入数据库,从而避免数据错误和应用程序故障。
-
常见的表约束:
-
主键约束primary key——用于确保表中的每一行都有可以唯一识别自己的一列或多列。
主键约束确保:主键列的每个值都唯一;逐渐列不能NULL。
-
-- 创建学生表,id(主键),name,age
CREATE TABLE student(
id int PRIMARY KEY,
name VARCHAR(20),
age int
);
DESC student;
-- 添加数据
insert into student VALUES (1,"lili",26),(2,"jay",20);
-- 查看
SELECT * FROM student;
-- 删除主键
ALTER TABLE student drop PRIMARY KEY;
-- 单独添加主键
ALTER TABLE student MODIFY id int PRIMARY KEY;
-
主键自增约束auto_increment——用于为表中的某一列(通常是主键列)自动生成唯一的递增值。
-- 因为之前创建了student,为了练习新的约束,现在删除
-- 删除表
drop TABLE student;
show tables;
-- 创建学生表,id(主键自增),name,age
CREATE TABLE student(
id int PRIMARY KEY auto_increment,
name VARCHAR(20),
age int
);
DESC student;
-- 添加数据
insert into student VALUES (NULL,"Amy",20),(NULL,"bob",18);
-- 删除自增
ALTER TABLE student MODIFY id int;
-
唯一约束unique——列中的唯一,但是允许为空,一张表可以有多个唯一约束,用于保证不同列或组合的值唯一;
-- 创建学生表,id(主键自增),name(唯一),age
CREATE TABLE student(
id int PRIMARY KEY auto_increment,
name VARCHAR(20) UNIQUE,
age int
);
-- 添加数据
insert into student VALUES (null,"lili",20);
-- 添加数据
insert into student VALUES (null,"lili",20);
insert into student VALUES (null,"lili",12);
-- 删除唯一约束
ALTER table student drop index NAME;
-- 单独添加唯一约束
ALTER table student MODIFY age int unique;
-
非空约束not null——非空约束,用于约束该字段的值不能为空。
-- 创建学生表,id(主键),name,age,非空
CREATE TABLE student(
id int PRIMARY KEY auto_increment,
name VARCHAR(20) NOT NULL,
age int NOT NULL
);
-- 添加数据
insert into student VALUES (null,"lili",12);
insert into student VALUES (null,null,12);
insert into student VALUES (null,"",12);
2.7 表关系
多对一:
-
定义:这意味着在一个表中,可以有多个记录与另一个表中的单个记录相关联。换句话说,一个表中的某一列的值可以重复,这些重复的值都指向另一个表中的唯一记录。比如一个人有多件衣服;一个user有多个手机号。
常用于表示两个表之间的连接,其中一个表中的多行可以与另一个表中的单行相关联。这种关系通常通过外键(Foreign Key)来实现。
外键约束:
-
定义:外键约束(Foreign Key Constraint)是用来维护数据库表之间数据一致性和完整性的一种机制。它指定了一个表中的列(或列的组合)必须在另一个表的主键或唯一键列中有对应的值。通过外键约束,可以确保在一个表(称为子表或从表)中的值在另一个表(称为父表或主表)中已经存在,从而防止孤立数据的产生。
-
语法:
CREATE TABLE 子表名 (
列名1 数据类型,
列名2 数据类型, ... CONSTRAINT 外键名 FOREIGN KEY (外键列) REFERENCES 父表名(主键列));
-- 创建user
CREATE TABLE user(
id int PRIMARY key auto_increment,
name VARCHAR(20) NOT NULL
)ENGINE=INNODB; -- 存储引擎,不同的表存储的过程有区别
desc user;
-- 添加数据
insert into user VALUES (null,"lili"),(null,"Bob");
-- 查看
SELECT * from user;
-- 创建订单详情表
CREATE TABLE orderlist(
id int PRIMARY key auto_increment,
number VARCHAR(20) not null,
uid int,
CONSTRAINT u_o FOREIGN KEY (uid) REFERENCES user(id)
-- 外键名 联系到 哪张表 哪个
)ENGINE=INNODB;
desc orderlist;
-- 插入数据
INSERT into orderlist VALUES (null,"hm01",1),(null,"hm02",1),(null,"hm03",2),(null,"hm04",2);
-- 查看
SELECT * from orderlist;
-- 插入
-- 因为3在user表中不存在,在orderlist表中插入该数据是不允许的
insert into orderlist VALUES (null,"hm05",3);
-- 删除外键约束
ALTER table orderlist drop FOREIGN key u_o;
-- 添加外键元素
alter table orderlist add CONSTRAINT u_o FOREIGN key (uid) REFERENCES user(id);
-- 删除外键约束
ALTER table orderlist drop FOREIGN key u_o;
-- 添加外键元素
alter table orderlist add CONSTRAINT u_o FOREIGN key (uid) REFERENCES user(id);
外键级联操作:
-
定义:是指当对主键表(也称为父表或引用表)中的数据进行更新或删除时,自动对包含外键的表(也称为子表或从属表)中的相关数据进行相应的更新或删除。
-- 进行外键级联操作时,先删除外键约束,然后再添加外键约束同时添加外键级联
alter TABLE orderlist add CONSTRAINT u_o FOREIGN key (uid) REFERENCES user(id)
on UPDATE CASCADE on DELETE CASCADE;
-- 修改,将Bob的id改为4
UPDATE user set id=4 WHERE id=2;
SELECT * FROM user;
-- 删除,删除Bob
DELETE from user where id=4;
SELECT * FROM user;
-- 查看
SELECT * from orderlist;