【问题标题】:Constraint on two foreign keys约束两个外键
【发布时间】:2019-07-09 06:54:43
【问题描述】:

我创建了一个数据库来以 ACID 方法存储数据点。一个表本身保存数据点,并具有数据源的外键。每个地理位置有多个来源,所以我为这些位置准备了另一个表格。从数据源中,我在这些位置上有一个外键,一切都很好。

现在我的老板要求我在传感器数据中创建一个新列,以链接到该位置,以便于调试和提高性能。但我仍然希望数据库检查是否无法为特定数据源以及源和位置不匹配的位置插入数据点。
如果数据库能够根据提供的 sourceid 自动生成位置 ID,那就更好了。

数据

ID | SrcID | LocID | MoreColumns
---+-------+-------+------------
 1 |     1 |     1 |           X - OK
 2 |     1 |     2 |           X - Bad, DataSource is not at location 2
 3 |     4 |     4 |           X - Bad, Location 4 doesn't exist, but is caught by FK-Constraints

ID | LocID | MoreColumns
---+-------+------------
 1 |     1 |           X
 2 |     1 |           X
 3 |     2 |           X

位置

ID | MoreColumns
---+------------
 1 |           X
 2 |           X

如何在这里实现数据一致性?
使用 FK,它会检查 Loc 和 Src 是否存在,但我如何确保数据指向的位置与其源指向的位置相同?

【问题讨论】:

  • 您可以在一个约束中使用多个列(如果这是一个实际的“外键”,则值得商榷)。查看stackoverflow.com/questions/3178709/…
  • 我现在将它实现为外键。据我所知,一个约束只适用于一个表,因此没有加入检查新位置 id 将与 src 中的位置 id 匹配。我正在考虑观点,因为这应该是他们的目的,但我的老板不同意。
  • @DaveBrown 您是否建议我不要对 src 和 loc 表使用两个signle FK,而是对 src 使用一个复合 FK?我刚刚尝试过,它给了我错误'表“Src”的列与主键或唯一约束不匹配'(粗略翻译)
  • 您的 SRC 和 Loc 表各有 PK(一、整数、ID)。硬外键不能让您说“我只想要具有有效位置的有效源”,因为 SrcID 为 1 和 LocID 为 2 都存在并且独立检查。您需要进一步的约束来从纯 FK 角度和有效性角度进行检查。
  • @DaveBrown 是的,这正是问题所在。我该怎么做?

标签: sql-server foreign-keys constraints


【解决方案1】:

我通过将 Src 中的主键设置为复合主键 (ID, LocID),然后将外键从 (SrcID, LocID) 的数据到 Src (ID, LocID) 中的主键,解决了这个问题。
为了确保只为 Src 提供唯一的 IDs,我在 Src 中的 ID 上创建了另一个唯一索引。
从 Src 到 Loc 的外键保持原样。

【讨论】:

    猜你喜欢
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 2017-04-20
    • 2018-03-05
    相关资源
    最近更新 更多