【问题标题】:How to make multiple tables share the id column in MySQLMySQL如何让多个表共享id列
【发布时间】:2011-12-12 12:04:42
【问题描述】:

以前有人问过这个问题,但从未真正回答过(至少我想这样做)。我的数据库中有三个表,threadsresponsesvotes。我需要他们只分享id 字段。所以我可以做类似的事情

SELECT * FROM threads AS t JOIN responses AS r JOIN votes AS v
WHERE id = 15

并且只会检索线程响应或(不包括)id = 15 的投票记录。

有没有办法在不创建额外表格的情况下做到这一点?我不是在问这是否是个好主意(可能不是),而是问是否可行以及如何去做。

【问题讨论】:

  • SQL 表是平面结构。如果他们要通过 key 共享一个 id,则三个表中的每一个都需要有一个 id 列。在一个表(可能是线程)上,它是主键,而在另外两个表上,它是返回线程的外键。

标签: mysql sql database select


【解决方案1】:

如果我理解正确,您想获取线程、响应或使用 id = 5 投票。在 MySQL 中,没有机会提供跨表的 id 字段唯一性(即阻止创建响应并使用相同的 id 值投票) ,但您可以在您的应用中执行此操作。

您可以通过这种方式获取所需的行:

SELECT id, name, 'thread' AS `type` FROM threads WHERE id=5
UNION
SELECT id, name, 'response' AS `type` FROM responses WHERE id=5
UNION 
SELECT id, name, 'vote' AS `type` FROM votes WHERE id=5

【讨论】:

    【解决方案2】:

    您的选择将引发错误,因为 where 子句中的 id 字段不明确。我想这三个表中都有一个id 字段。

    SELECT * FROM threads AS t JOIN responses AS r JOIN votes AS v
    WHERE id = 15
    

    因此,即使 id 字段在这些字段之间“以某种方式共享”,您也必须使 where 子句明确:

    SELECT * FROM threads AS t JOIN responses AS r JOIN votes AS v
    WHERE t.id = 15
    

    此外,我认为线程和响应具有多对一的关系,这意味着可以有多个响应对应于单个线程。这意味着responses 表将有一个thread_id 字段。 responses 表中的id 字段不能与对应的thread 记录中的id 字段具有相同的值,因为id 字段在两个表中必须是唯一的。

    responsesvotes 之间的关系也是同样的逻辑(单个响应将获得很多票)。

    因此我认为不可能在这三个表之间共享id 字段

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-16
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多