1

我正在使用 mysql 数据库,我想引用复合键的一部分(其中包含 2 个字段),并避免 mysql 在引用条目被删除时删除引用条目,如果有高跷的一部分引用表中的复合键。

这是问题所在:

  • 两张表:

    • T1(Some_PK,#Pointer_To_PKA,some_field)
    • T2( PKA , PKB , Some_field)
  • T2 有一个由两个字段PKAPKB组成的复合密钥

  • 在 T1 中有一个外键约束,它引用 T2 的字段PKA但不引用PKB(仅引用了复合键的一半)。

问题是,当我删除 T2 中的一行时,“ON CASCADE DELETE”约束删除了 T1 中的行,该行引用了 T2 中删除的行,但该行(来自 T1)在删除之前还引用了 T2 中的其他字段:

============= T2 =============
 [PKA] | [PKB] |  Some_field
------------------------------
     1 |     1 | Some content
     1 |     2 |     abcdefgh
     2 |     3 |       zefhds
______________________________

==================== T1 ========================
 [Some_PK] |  #Pointer_To_PKA |    Some_field
------------------------------------------------
         A |                1 |   Lorem ipsum
         B |                2 | other content
         C |                1 |    dhtshfgnfn
________________________________________________

使用上面的示例,我希望当我从 T2 ( 1 , 1 , 'Some content') 中删除第一行时,从 T1 中删除第一行和第三行,因为 T2 中仍然会有一个条目(第二行),其中包含 T1 引用的复合键的一半。

有人知道如何处理吗?

4

1 回答 1

0

我几乎从不说,“不要那样做”。

不要那样做

. . . 系统不强制要求引用的列是唯一的或声明为 NOT NULL。对于 UPDATE 或 DELETE CASCADE 等操作,对非唯一键或包含 NULL 值的键的外键引用的处理没有明确定义。建议您使用仅引用 UNIQUE(包括 PRIMARY)和 NOT NULL 键的外键。

您对 PKA 没有唯一的约束。因此,请遵循文档中的建议。重新设计你的桌子。

于 2013-08-07T12:39:41.907 回答