数据库主键与外键
主键概念:主关键字(primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。
外键概念:外键(foreign key)能保持数据的一致性、完整性
主键用力啊标识数据的唯一性,而外键主要保证多张表的数据一致性,也就是需要保持多表同一数据的一致性,也许直接晦涩的解释其概念,对于起步接触数据库的人来说不太友好可以看如下实际用例。
建一张department表,也可以把其理解为主表,这张主表用于记录部门id的唯一性。
create table department(
id int primary key auto_increment,
dep_name varchar(20),
dep_location varchar(20)
);
建一张employee表,也可以把其理解为从表,这张表用于记录员工所在部门的一致性
create table employee(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int foreign key -- 外键对应主表的主键
);
向这两张表中添加数据
-- 添加 2 个部门
insert into department values(null, '研发部','广州'),(null, '销售部', '深圳');
select * from department;
-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);
select * from employee;
比如想把研发部的id改为5,这时直接修改是改不了的,因为表employee中有三个数据dep_id都是1,如果直接修改表department中的id,那个前面说的三个数据就会找不到对应的键值,所以数据库会在你修改后直接报错来阻止这种事情的发生。要改的话只能先把表employee中dep_id是1的数据设为null,再把department的id列中1改成5,最后还得再把表employee中dep_id的null设为5,才能修改成功。显然这样是非常麻烦的,这时候我们就需要一种操作叫做级联操作。级联操作是能在修改和删除主表的主键时,同时更新或删除副表的外键值。
因为级联操作是作用在外键上的,所以无法单独添加。因为我们之前已经添加了外键,想要再在外键上添加级联的话要先把外键删除了,然后再在添加外键的语句后面加上ON UPDATE CASCADE \ON DELETE CASCADE即可。
alter table employee drop foreign key ed_fk; --删除外键
ALTER TABLE employee ADD CONSTRAINT ed_fk FOREIGN KEY ( dep_id ) REFERENCES department ( id ) ON UPDATE CASCADE; --添加外键和级联更新。此时我们再更新主表的部门id那么我们从表的员工所在部门id也就直接跟着变了,这就保证了数据的一致性。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)