【问题标题】:Can a unique key with 3 columns act as a foreign key for one-to-many relationship [duplicate]具有 3 列的唯一键是否可以作为一对多关系的外键 [重复]
【发布时间】:2020-12-14 11:08:54
【问题描述】:

我有一个one-to-many 关系的经典案例。

目前,我有一个如下所示的 SQL,其中 no relationship 在两个表(my_tablecomments 表)之间定义了任何关系:

SELECT
    (SELECT
            COUNT(1)
        FROM
            comments
        WHERE
            comments.gl_account = my_table.gl_account
                AND comments.document_number = my_table.document_number
                AND comments.division = my_table.division) AS comments_count,
    my_table.division,
    my_table.gl_account,
    my_table.document_number,
    my_table.reviewer_group,
    my_table.id
FROM
    my_table;

除了来自my_table 的其他列之外,它还返回comments 计数。

我想通过使用1-to-many 关系来更正这个SQL;从my_table(一个)到comments table(很多)。

我该怎么做?请注意,上面的内部查询使用了三列。

感谢您提供示例 SQL sn-p 提示,谢谢!

【问题讨论】:

  • 为什么他们“没有任何关系”并且仍然在子查询 WHERE 子句中比较他们的列?
  • 我的意思是它们在逻辑上存储相同的数据。但是没有这样定义的约束,例如外键。

标签: mysql sql database-design


【解决方案1】:

推测这三列在my_table中是唯一的,所以你可以将它们声明为主键:

create table my_table (
    . . . ,
    primary key (division, gl_account, document_number)
);

然后就可以声明外键关系了:

create table comments (
    . . . ,
    foreign key (division, gl_account, document_number) references my_table (division, gl_account, document_number)
);

【讨论】:

  • 应该用唯一的工作代替主键吗?
  • @Akshay 如果它是唯一的,那么实现 PK 的问题是什么?
  • @AkshayLokur 。 . . MySQL 将仅使用 key -- any 索引识别外键引用。该标准指定uniqueprimary key。但是你应该使用主键;外键引用是定义它们的主要原因之一。
  • @GordonLinoff,有道理。 PK 已分配给另一列,我现在需要更改它。可以举例说明如何获得 cmets 计数?
  • @AkshayLokur 。 . .错误的做法。使用第二个表中的主键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多