版权声明:. https://blog.csdn.net/WildestDeram/article/details/89439196
外键约束的使用
外键是表的一种特殊字段,它可以参照另外一个表(主表)来创建一个从表。
只有InnoDB存储引擎支持外键,在创建外键的时候,子表的外键必须关联父表的外键。
-- 创建新数据库test5
CREATE DATABASE test5;
-- 创建表new_cate
CREATE TABLE new_cate(
id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT KEY COMMENT '编号',
cateName VARCHAR(50) NOT NULL UNIQUE COMMENT '分类',
cateDesc VARCHAR(100) NOT NULL DEFAULT '' COMMENT '分类描述'
);
-- 插入数据
INSERT new_cate(cateName) VALUES('国内新闻'),
('国际新闻'),
('娱乐新闻'),
('体育新闻');
-- 创建新闻表(news)
CREATE TABLE news(
id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT KEY COMMENT '编号',
title VARCHAR(100) NOT NULL UNIQUE COMMENT '新闻标题',
content VARCHAR(100) NOT NULL COMMENT '新闻内容',
cateId TINYINT NOT NULL COMMENT '新闻分类所属的编号'
);
-- 插入数据
INSERT news(title,content,cateId) VALUES('a1','aaa1',1),
('a2','aaa2',1),
('a3','aaa3',4),
('a4','aaa4',2),
('a5','aaa5',3);
-- 查询news id title content
-- news_cate cateName
SELECT n.id,n.title,n.content,c.cateName
FROM news AS n
JOIN new_cate AS c
ON n.cateId=c.id;
-- 例子
-- 添加无效分类编码
INSERT news(title,content,cateId) VALUES('a6','aaaa6',45);
-- 删除new_cate中id=2
DELETE FROM new_cate WHERE Id=2;
执行上述操作,发现添加和删除都可以进行操作,这样对于后期数据的维护造成麻烦。就比如删除new_cate中id=2后,再打开news会发现cateId=2的值依然存在,这样的删除在实际开发中是不正确的。
此时我们就需要用到外键,保证数据的一致性和完整性
-- 添加外键有两种形式,第一是在表内直接抒写,第二就是动态添加
-- 表内添加
[CONSTRAINT 外键名称]FOREIGN KEY(字段名称) REFERENCES 主表(字段名称)
创建外键时要注意,外键字段是依赖已存在表的的主键,所以说一定要先有主表。就比如新闻分类表和新闻表,新闻分类表就是主表,接着创建外键的时候就会参照主表中的主键来建立,也就是new_cate中的cateId参照news中的Id来创建的。
注意:外键数据类型 = 主键数据类型。字符长度可以不相同,但是类型要相同
CREATE TABLE news(
Id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT KEY COMMENT '编号',
title VARCHAR(100) NOT NULL UNIQUE COMMENT '标题',
content VARCHAR(1000) NOT NULL COMMENT '内容',
cateId TINYINT UNSIGNED NOT NULL,
FOREIGN KEY(cateId) REFERENCES new_cate(id)
);
-- 查看详细信息
SHOW CREATE TABLE new;
如果外键字段没有添加索引,MySql会自动帮助我们添加索引,字表的外键关联的必须是父表的主键
-- 测试非法记录
INSERT news(title,content,cateId) VALUES('b1','bbbb1',8);
因为有了外键的约束,就无法添加不合法的数据
-- 测试删除父表中的记录和删除父表
DELETE FROM news_cate WHERE id=1;
UPDATE new_cate SET id=10 WHERE id=1;
无论是添加还是删除,都是报错,包括修改。这就是外键起的作用
-- 合法插入数据
INSERT new_cate(cateName) VALUES('教育新闻');
-- 将教育新闻修改称教育
UPDATE new_cate SET cateName='教育' WHERE id=5;
还可以通过以下方式创建
CREATE TABLE news(
Id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT KEY COMMENT '编号',
title VARCHAR(100) NOT NULL UNIQUE COMMENT '标题',
content VARCHAR(1000) NOT NULL COMMENT '内容',
cateId TINYINT UNSIGNED NOT NULL,
CONSTRAINT cateId_fk_newsCate FOREIGN KEY(cateId) REFERENCES new_cate(id)
);