数据库MYSQL学习总结25—外键约束的使用

版权声明:. 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)
);

猜你喜欢

转载自blog.csdn.net/WildestDeram/article/details/89439196