找回密码
 立即注册

QQ登录

只需一步,快速开始

TimZhang

中级会员

10

主题

78

帖子

658

积分

中级会员

积分
658
TimZhang
中级会员   /  发表于:2019-5-13 13:24  /   查看:4934  /  回复:0
本帖最后由 Simon.hu 于 2019-5-13 13:50 编辑

经常有用户问我,为什么设置的查询条件不起效果?要么数据找不对,要么数据找不出,以及其编辑数据时发现内容加载不对,或者内容无法加载,等等。
这类问题前前后后遇上多次,归根结底,都是数据库外键设置不对。今天就专门写一篇帖子,把问题讲明白。


首先聊一下数据库基本知识:
如果你将 B 表中某字段 Y 设置成 A 表的外键,也就是说: A 表通过字段 X 关联到 B 表字段 Y
那么就一定要清楚:字段 Y 在 B 表中是唯一的、不重复的;如果字段 Y 不能保证唯一性,也就失去了作为外键的资格。

反之亦然:如果使 B 表通过字段 Y 关联到 A 表字段 X,那么就要确保字段 X 在 A 表中是唯一不重复的。

用更通俗的话说:谁被关联,谁就是唯一的。

下面我们用实际案例来解释,为什么被关联字段是唯一不重复的。
首先,我们准备基础数据,如图所示:
2019051301.jpg
2019051302.jpg
2019051303.jpg
这里有三张数据表:“产品类别表”,“产品表推荐用法”,“产品表不推荐用法”。
从名字可以看出,“产品表不推荐用法”是本次实验的反面教材,它与“产品表推荐用法”区别在于:关联的外键不同。

在“产品表推荐用法”案例中,“产品类别表”的“ID”字段作为其外键被关联。
在“产品表不推荐用法”案例中,“产品类别表”的“类别代码”字段作为其外键被关联。
读者仔细观察可以发现,“产品类别表”中,“ID”字段是唯一的,“类别代码”字段是不唯一的。

现在,我们运行项目,对比页面表格内容:
2019051304.jpg
在数据库中,产品表实际上只有 8 条数据,但是 表格2 却显示了 16 行内容。
我们看 表格2 中第 2 行,我用绿色方框将其选中,其实这是一条根本不存在的无效数据。因为:ID 为 1 的产品,其类别名称是“苹果手机-白色”,然而这里却显示为“苹果手机-黑色”。
为什么 表格2 会显示无效数据呢?
原来,在活字格中,表格之间设置关联字段相等于对两个数据表执行 LEFT JOIN 操作。
我们把以上两种关联方式翻译成 SQL 语句,原理如下:
2019051305.jpg
现在,我们基于以上两种关联方式,对表格做数据查询操作,效果对比如下:
2019051306.jpg
2019051307.jpg
对于 表格2,不但查询结果不对,而且当您操作目标是无效数据时,发生各种疑难问题也就难以避免。

照例,最后将工程文件呈上。
使用ID作为外键.fgcc (124.46 KB, 下载次数: 229)
2019051305.jpg

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部