MY RDBMS是SQL Server 2017。
嗯,有很多问题。我了解历史记录跟踪表不应包含PK,否则跟踪历史记录将很困难或不可能-如果我错了,请更正我。
我有一个这样的数据库:
idn
和uid
是标识列,它们没有相互连接。
在Main
表中,我有PK (idn, id)
以及unique_key(id
)和unique_key(id, start_date
)[但是,第二个唯一键对我没有帮助,我了解原因]
在Main_Info
中,我有PK(uid
)和FK(id
),它们引用了Main(id)
我已经解释了实际的代码行。
如果仅在Main_Info表上跟踪历史记录,则没有问题。出现此问题是因为我需要跟踪Main表上[address]的任何更改的历史记录。
是否确实可以在此(主)表上跟踪历史记录?
这是我尝试按照上述设计将其他数据插入Main
表中时收到的错误消息:
Msg 2627,第14级,状态1,第4行
违反UNIQUE KEY约束
在尝试了一些不同的唯一键设计后,出现了以下错误消息:
信息1776,级别16,状态0
被引用表中没有与外键中引用列列表匹配的主键或候选键1750级16状态1消息
无法创建约束或索引
Msg 1776
是由于我在id, start_date
表上具有Unique_key(Main
)而引起的。因此,实质上,必须在Main_Info
表中引用整个复合唯一键。这是我看到问题的严重程度的时候。
假设我的Main(id)= 122
这是我对数据库的期望的“示例”:
(在理想情况下,Main的PK将保持为群集PK)
主要{(1,122,100 Main St,1900/01/01,1905/01/01),(2,122,101 Main St,1905/01/01,1908/01/01),( 3,122,110 Main St,1908/01/01,1908/01/09),(4,122,111 Main St,1908/01/09,NULL),…}
以NULL作为end_date表示该记录仍然有效。
Main_Info {(1,122,'store_type','department store',1900/01/01,NULL),(2,122,'owner','someone',1900/01/01,NULL), …}
我只是在这里添加一些额外的信息,以说明如果我未对Main(id)设置唯一键约束,会发生什么情况:
1776年消息,级别16,状态0, 被引用表中没有与外键中引用列列表匹配的主键或候选键
1750消息,第16级,状态1, 无法创建约束或索引。