【问题标题】:mysql use FOREIGN KEY on two columnsmysql 在两列上使用 FOREIGN KEY
【发布时间】:2014-03-20 06:10:47
【问题描述】:

我有以下表格:

表 1

| id | nr | name | ...

表2

| id | nr | prod | ...

表3

| id | nr | prod | act | data | publ | ...

产品

| id | id_prod | prod | name | ...


TABLE2.nr FOREIGN KEY TABLE1.nr DELETE RESTRICT UPDATE CASCADE

TABLE3.nr FOREIGN KEY TABLE1.nr DELETE RESTRICT UPDATE CASCADE

TABLE2.prod FOREIGN KEY PROD.id_prod DELETE RESTRICT UPDATE CASCADE

TABLE3.prod FOREIGN KEY TABLE2.prod DELETE RESTRICT UPDATE CASCADE

问题在TABLE2TABLE3之间

假设我有

表2

| id | nr | prod | ...
  1   301   1001
  2   301   1005
  3   301   2098
  4   305   1005
  5   305   2099

表3

| id | nr | prod | act | data | publ | ...
  1   301   1005   1     ...    ...    ...
  2   301   1001   NULL  ...    ...    ...
  3   305   2099   1     ...    ...    ...
  4   305   2098   1     ...    ...    ...

现在假设我想DELETE FROM TABLE2 WHERE id = 4

Mysql 返回错误,因为 TABLE2.prod 和 TABLE3.prod 之间存在 FOREIGN KEY。

但实际上,我并没有用nr = 301 接触对象的数据,它在TABLE3 中也有一个条目301 1005

我该如何解决这个问题?是否可以在 2 列之间添加 FOREIGN KEY?

我想防止从 TABLE2 中删除 TABLE3 中存在的数据,但比较列 nr AND prod 不仅是 nr OR prod(现在我遇到了 prod 的问题)。

谢谢!

【问题讨论】:

    标签: mysql foreign-keys


    【解决方案1】:

    为什么 T3 的 prod 外键要指向 T2?它应该指向 Prod。

    T3 中的 ID #1 指向 1005,它指向您尝试删除的 T2 中的条目。这违反了您在尝试删除该 T2 条目时设置的外键。

    【讨论】:

    • T2 定义了哪个产品有这个 nr 。 T1 定义了 nr 的全局特征。和 T3 的价格。因此,如果我将 T3.prod 直接指向 prod,我就无法控制 nr。 products,因为在 T3 中有很多行相同的产品和不同的价格,但只有一个是活动的。
    • 标识符的黄金来源应该只有一个。看起来 T1 应该是 nr 的主要候选人,而 Prod 应该是 prod 的主要候选人。您可能需要重新查看您的外键是否满足您的要求。
    • Prod 也用于 t1,2,3 之外的其他表中。 T1 是 nr 的主表。一排一排。 T2 具有 T1 的 nr 的 prod。每个 nr 都有多个 prod。每个 prod 都有一个价格,T3 有每个 nr 的每个 prod 的价格以及历史档案。事实上,列行为定义了现在哪个价格是活跃的。如何重新定义?
    • 那么听起来我最初的建议是成立的。 T3 应该参考 Prod 的 prod 和 T1 的 nr。只要每个条目的 prod 和 nr 值都是有效的(存在于 Prod 和 T1 中),那么您的数据完整性就会得到维护。
    • 我如何控制每个 nr 的哪些 prod 处于活动状态?对于每个 nr,它们都不相同,cms 上的用户应该能够为 nr 激活和停用 prod,依此类推
    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2021-01-18
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多