【问题标题】:Combine Composite foreign keys in MySQL?在 MySQL 中组合复合外键?
【发布时间】:2019-01-26 09:27:28
【问题描述】:

考虑 MySQL 中的 3 个表,即 T1T2A

T1 -> t1_id as pk, a_id
T2 -> t2_id as pk, a_id
A -> a_id

现在,我需要为 (T1T2) 创建一个映射表,以便

  1. 我只能用相同的 a_id 映射 t1_idt2_id
  2. 映射应该是多对多
  3. t1_idt2_id 的映射应保持唯一。

映射表的样子。

M_T1_T2 -> map_id as pk, a_id, t1_id, t2_id

问题:应该添加哪些外键约束?

【问题讨论】:

    标签: mysql foreign-keys relational-database


    【解决方案1】:

    t1 中的t1_id, a_idt2 中的t2_id, a_id 设置唯一约束。无论如何,这些对都是唯一的,因为 t1_idt2_id 是主键,因此是唯一的。但是需要这样的约束来允许外键引用这样的对。

    然后在你的链接表中,我们称之为t1_t2,有t1_idt2_ida_id和两个外键t1_id, a_idt1_id, a_id中引用t1_id, a_idt2_id, a_id引用@98765433 @在t2。也就是说,a_id 在两个引用记录中必须相同。

    要强制三元组 t1_id, t2_id, a_id 唯一,请对它们施加唯一约束,或者将它们声明为主键。

    CREATE TABLE a
                 (a_id integer,
                  PRIMARY KEY (a_id));
    
    CREATE TABLE t1
                 (t1_id integer,
                  a_id integer,
                  PRIMARY KEY (t1_id),
                  FOREIGN KEY (a_id)
                              REFERENCES a
                                         (a_id),
                  UNIQUE (t1_id,
                          a_id));
    
    CREATE TABLE t2
                 (t2_id integer,
                  a_id integer,
                  PRIMARY KEY (t2_id),
                  FOREIGN KEY (a_id)
                              REFERENCES a
                                         (a_id),
                  UNIQUE (t2_id,
                          a_id));
    
    CREATE TABLE t1_t2
                 (t1_id integer,
                  t2_id integer,
                  a_id integer,
                  PRIMARY KEY (t1_id,
                               t2_id,
                               a_id),
                  FOREIGN KEY (t1_id,
                               a_id)
                              REFERENCES t1
                                         (t1_id,
                                          a_id),
                  FOREIGN KEY (t2_id,
                               a_id)
                              REFERENCES t2
                                         (t2_id,
                                          a_id));
    

    【讨论】:

    • 是的,这个概念是正确的,并且在我应用的用例中非常有效。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2011-01-26
    相关资源
    最近更新 更多