【问题标题】:mysql common column criteria for joining tablesmysql 连接表的常用列条件
【发布时间】:2017-12-21 13:32:31
【问题描述】:

如果我有两个必须在它们之间执行连接的表,比如说

表 1:

groupdetails_table (groupid, no.of.members, created date) 

表 2:

groupuserdetails_table (groupid, userid, role status)

groupid 必须是键列还是可以是普通列?我需要一个解释。

是否必须是键列,如果是,为什么?

【问题讨论】:

  • 与您的问题无关,但您真的需要在您的所有表格中添加后修复 _table 吗?这使得所有表名都不必要的长
  • 你可以使用任何你想要的列来连接你的两个表。

标签: mysql sql join


【解决方案1】:

groupid 应该是 groupdetails_table 的主键和 groupuserdetails_table 的外键

groupuserdetails_table 中,您的键可能应该是(groupid, userid) 的组合

但是你可以加入任何你想要的列,不管它们是否是关键

【讨论】:

  • 感谢您的回复,对不起,我是 mysql 的初学者,需要知道当我根据关键列加入时我将获得的主要好处是什么
  • 你问错问题了。您加入您不需要的列,而不是给您带来好处。创建键的好处是 db 也创建索引 允许您更快地对该列进行搜索,同时确保您的表完整性。好吧,当您加入带有索引(或键)的列时,连接也更快。但这意味着您必须为那些非关键列添加索引。
  • 我还想知道当我在查询中给出(例如)作为左连接时,sql 引擎内部发生的 poroces,表将如何连接(水平或垂直)?(后台进程在sql引擎中)
  • 你又问错问题了。我们不能在这里给你一个加入教程。您最好查看w3schools.com/sql/sql_join.asp 以从示例中了解更多信息
【解决方案2】:

我不确定您的数据库的进一步架构。 groupid 看起来应该是表 groupdetails_table 上的主键...除非您有一个名为 group 的不同表。而groupuserdetails_table 看起来像是 groupdetails 和 group 之间的关联表。

在任何情况下,如果您想在关系数据库(如 MySQL)中执行有效连接,这两列几乎都应该是键,无论是外键还是主键。这是因为将列设置为键可以确保具有相同值的字段实际上是同一事物,并且引用不同事物的字段永远不会具有相同的值。

如果您有一个名为group(或groups,取决于您的偏好)的表,并且没有将字段groupid 分配为主键,那么两个不同的组可能具有相同的ID。

外键确保一个表中的一个字段与另一个表中的一个字段完全对应。假设你有一个表group_user,那么它的字段groupid应该是一个外键,指的是group.groupid。这意味着您不能让group_user 中的任何行引用不存在的组。

因此,虽然您可以在技术上加入任何您想要的列,但为了确保加入有意义,加入的列应该是键。

【讨论】:

    【解决方案3】:

    就可执行性而言,它不必是键,因为您可以有一个不涉及键的连接条件,但由于它是一个 ID,因此您需要将其设为 foreign key 以避免将来出现不一致。如果它不是foreign key,那么没有什么可以阻止您插入/更新参考table 中不存在的groupid 值。此外,如果它不是 foreign key,则在从引用 table 中删除记录时,您最终可能会出现悬空的记录,其 groupid 值不再存在于引用表中。

    【讨论】:

      【解决方案4】:

      这里的数据库架构有问题:

      1. 您应该为表中的每条记录提供唯一的 ID;
      2. 如果要限制最大用户数,则将no.of.members 重命名为max_members(或类似),否则按group_id 计算group_user 记录中的记录数;

      也尽量遵循社区的条件

      • 在表格或列中的单词之间使用下划线符号,而不是点

      我更喜欢:

      group(id[key], created)
      group_user(id[key], group_id, role, status)
      and group.id = group_user=group_id
      

      【讨论】:

        猜你喜欢
        • 2023-03-09
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-15
        • 2015-09-20
        • 2011-04-29
        相关资源
        最近更新 更多