sql中的密钥是否仍然是视图中的密钥

n00*_*mer 6 mysql sql concat key

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

我跑SELECT * FROM FISH.这让我看到了所有领域的视图.那么,如果A是原始表中的键,它是视图中的键吗?意思是,如果我有一张桌子FISH2,我跑了

 SELECT * FROM (SELECT * FROM FISH) D, (SELECT * FROM FISH2) E WHERE D.A = E.A
Run Code Online (Sandbox Code Playgroud)

相关领域仍然是关键吗?

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

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
Run Code Online (Sandbox Code Playgroud)

如果A和B是原始表中的键,它们的串联是否也是键?

谢谢 :)

Ron*_*nis 2

如果A是 中的键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
Run Code Online (Sandbox Code Playgroud)

...逻辑上等价于以下语句,大多数数据库(包括MySQL)都会执行转换:

select *
  from fish
  join fish2 on(fish.a = fish2.a)
Run Code Online (Sandbox Code Playgroud)

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

连接不保持唯一性。考虑以下情况:

concat("10", "10") => "1010"
concat("101", "0") => "1010"
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

...不会(必然)产生与以下相同的结果

select * 
  from fish 
  join fish2 on(
       fish.a = fish2.a
   and fish.b = fish2.b
  )
Run Code Online (Sandbox Code Playgroud)

之所以这么写,是因为碰撞取决于实际值。大约前一段时间,我发现了一个错误,其根本原因正是如此。在错误出现之前,该代码已经运行了好几年。