gpt4 book ai didi

mysql - sql 中的键仍会保留 View 中的键吗

转载 作者:可可西里 更新时间:2023-11-01 06:50:33 24 4
gpt4 key购买 nike

假设我有一个名为 FISH 的 mysql 表,其中包含字段 A、B 和 C。

我运行 SELECT * FROM FISH。这让我对所有领域都有一个看法。那么,如果 A 是原始表中的键,它是否也是 View 中的键?意思是,如果我有一张表 FISH2,我运行了

 SELECT * FROM (SELECT * FROM FISH) D, (SELECT * FROM FISH2) E WHERE D.A = E.A

相关字段还会是键吗?

现在,让我们更进一步。如果我跑

SELECT * FROM (SELECT CONCAT(A,B) AS DUCK, C FROM FISH) D, (SELECT CONCAT(A,B) AS DUCK2, C FROM FISH2) E WHERE D.DUCK = E.DUCK2

如果 A 和 B 是原始表中的键,那么它们的串联也会是键吗?

谢谢:)

最佳答案

如果 Afish 中的键,则仅对 fish 的任何投影都会产生一个结果集,其中 A 仍然是唯一的。

表 fish 和任何具有 1:1 关系的表(例如 fish_type)之间的连接将产生一个结果集,其中 A 是唯一的。

与 fish 具有 1:M 或 M:M 关系的另一个表(例如 fish_beits)的连接将不会产生 A 唯一的结果,除非您在“其他”端提供过滤谓词(例如bait='Dynamite').

SELECT * FROM (SELECT * FROM FISH) D, (SELECT * FROM FISH2) E WHERE D.A = E.A

...在逻辑上等同于下面的语句,大多数数据库(包括MySQL)都会进行转换:

select *
from fish
join fish2 on(fish.a = fish2.a)

A 在结果集中是否仍然唯一取决于 fish2 的键及其关系(见上文)。

串联不保持唯一性。考虑以下情况:

concat("10", "10") => "1010"
concat("101", "0") => "1010"

因此,您的最终查询...

SELECT * 
FROM (SELECT CONCAT(A,B) AS DUCK, C FROM FISH) D
,(SELECT CONCAT(A,B) AS DUCK2, C FROM FISH2) E
WHERE D.DUCK = E.DUCK2

...不会(必然)产生与

相同的结果
select * 
from fish
join fish2 on(
fish.a = fish2.a
and fish.b = fish2.b
)

我写必要的是因为冲突取决于实际值。大约前一段时间我找到了一个错误,根本原因就是这个。在错误出现之前,代码已经工作了几年。

关于mysql - sql 中的键仍会保留 View 中的键吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5369320/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com