目录
01. 三表复合查询
02. 对比外键约束的作用
03. 添加外键_建表时添加
正文
01. 三表复合查询
从性能角度讲,多表联合查询没有从单表查询后合并性能高SELECT a.id,a.name,b.tel,c.emailFROM tbl_name1 AS aJOIN tbl_name2 AS bON a.telId=b.idJOIN tbl_name3 AS cON b.emailId=c.idORDER BY a.id DESCLIMIT 0,2;
02. 对比外键约束的作用
新建两个表并测试是否正常查询// 新建分类表CREATE TABLE tbl_cate(id TINYINT UNSIGNED AUTO_INCREMENT KEY,cateName VARCHAR(50) NOT NULL UNIQUE,cateDesc VARCHAR(100) NOT NULL DEFAULT '');// 插入数据INSERT tbl_cate(cateName) VALUES('本地'),('时政'),('财经'),('体育');// 新建新闻表CREATE TABLE tbl_news(id INT UNSIGNED AUTO_INCREMENT KEY,title VARCHAR(100) NOT NULL UNIQUE,content VARCHAR(1000) NOT NULL,cateId TINYINT UNSIGNED NOT NULL);// 插入数据INSERT tbl_news(title,content,cateId) VALUES('new1','new11111',1),('new2','new22222',1),('new3','new33333',4),('new4','new44444',2),('new5','new55555',3);// 测试查询tbl_news id title content,tbl_cate cateNameSELECT a.id,a.title,a.content,b.cateNameFROM tbl_news AS aJOIN tbl_cate AS bON a.cateId=b.id;
如果此时将分类表中的时政类新闻删除掉,而新闻表中的分类id信息还是存在的,即使我们此时往新闻中添加一个非法数据(即分类表中没有的信息)也是可以正常添加的
// 测试非法数据,也可以正常添加INSERT news(title,content,cateId) VALUES('a6','aaaa6',45);
如果要保持数据的完整性和一致性就需要使用——外键,外键的主要作用就是保持数据的完整性和一致性。
03. 添加外键_建表时添加
重新创建两个表并添加外键。添加外键有两种方式,一种是建表时添加,一种是动态添加。
// 建表时添加外键 格式[CONSTRAINT 外键名称] FOREIGN KEY(字段名称) REFERENCES 主表(字段名称)// 新建分类表CREATE TABLE tbl_cate(id TINYINT UNSIGNED AUTO_INCREMENT KEY,cateName VARCHAR(50) NOT NULL UNIQUE,cateDesc VARCHAR(100) NOT NULL DEFAULT '')ENGINE=INNODB;// 新建新闻表// 如果没有指定外键名称,创建时会自动添加一个外键名称CREATE TABLE tbl_news(id INT UNSIGNED AUTO_INCREMENT KEY,title VARCHAR(100) NOT NULL UNIQUE,content VARCHAR(1000) NOT NULL,cateId TINYINT UNSIGNED NOT NULL,FOREIGN KEY(cateId) REFERENCES tbl_cate(id))ENGINE=INNODB;// 插入数据INSERT tbl_cate(cateName) VALUES('本地'),('时政'),('财经'),('体育');// 插入数据INSERT tbl_news(title,content,cateId) VALUES('new1','new11111',1),('new2','new22222',1),('new3','new33333',4),('new4','new44444',2),('new5','new55555',3);//测试非法记录,此时插入会不成功,报错提示INSERT tbl_news(title,content,cateId) VALUES('b1','bbbb1',6);//测试删除父表中的记录,此时 因为子表中有外键约束,所以会报错,不能删除DELETE FROM tbl_cate WHERE id=1;//更新也不会成功UPDATE tbl_cate SET id=10 WHERE id=1;//添加是可以的INSERT tbl_cate(cateName) VALUES('汽车');//修改更新刚刚添加的 汽车改为历史,此时时可以成功的,因为子表中没有使用这个分类UPDATE tbl_cate SET cateName='历史' WHERE id=5;UPDATE tbl_cate SET id=50 WHERE cateName='历史';
写在最后
本文是在学习MySQL过程中整理的相关笔记,是该系列的第十一篇文章,以上内容纯手敲,可能有手误的地方,也可能有错误的地方,希望大家一起指正和见谅。最后,希望与每一个努力的人同行,一起加油!!!
![ff13d47cc9fb6edd930e2d4b7634f806.png](https://img-blog.csdnimg.cn/img_convert/ff13d47cc9fb6edd930e2d4b7634f806.png)