我有四个表,看起来有点像这样:
CREATE TABLE [TableA]
( [ID] INT NOT NULL IDENTITY (1, 1) PRIMARY KEY )
CREATE TABLE [TableB]
( [A_ID] INT NOT NULL FOREIGN KEY REFERENCES [TableA] ([ID])
, [Value] TINYINT NOT NULL
, PRIMARY KEY ( [A_ID], [Value] ) )
CREATE TABLE [TableC]
( [ID] INT NOT NULL IDENTITY (1, 1) PRIMARY KEY
, [A_ID] INT NOT NULL FOREIGN KEY REFERENCES [TableA] ([ID]) )
CREATE TABLE [TableD]
( [ID] INT NOT NULL IDENTITY (1, 1) PRIMARY KEY
, [C_ID] INT NOT NULL FOREIGN KEY REFERENCES [TableC] ([ID])
, [Value] TINYINT NOT NULL )
但我想强制执行参照完整性,TableD
以便有效值可能只是与父记录关联的值TableB
之一。例如:TableA
TableC
TableA: ID
1
TableB: A_ID | VALUE
1 | 1
1 | 2
TableC: ID | A_ID
7 | 1
TableD: ID | C_ID | VALUE
1 | 7 | 1 -- Fine, Inserted
1 | 7 | 2 -- Fine, Inserted
1 | 7 | 3 -- Invalid, Rejected!
现在,我尝试添加一个这样的A_ID
列TableD
:
CREATE TABLE [TableD]
( [ID] INT NOT NULL IDENTITY (1, 1) PRIMARY KEY
, [C_ID] INT NOT NULL
, [A_ID] INT NOT NULL
, [Value] TINYINT NOT NULL
, FOREIGN KEY ([C_ID], [A_ID]) REFERENCES [TableC] ([ID], [A_ID])
, FOREIGN KEY ([A_ID], [Value]) REFERENCES [TableB] ([A_ID], [Value]) )
但我收到以下错误:
消息 1776,级别 16,状态 0,第 2 行被引用的表“ ”中没有与外键“”中的引用列列表匹配的
主键或候选键。TableC
FK__TableD__TableC
消息 1750,级别 16,状态 0,行 2
无法创建约束。请参阅以前的错误。
反正我不是很喜欢这个解决方案,因为它看起来是非规范化的——因为我将TableC
→<code>TableA 关系存储在两个不同的地方——但我想不出任何其他方式来强制引用完整性(除了触发器,它我想避免)。
有什么办法可以做到这一点?