1

假设有两个表,A 和 B。A
包含字段:id、a1、a2。
B 包含字段:id、b1、b2。

假设基于 id 字段从表 A 到 B 的一对多关系。

现在假设我想在表 b 上创建一个唯一约束,禁止我插入基于 b1、b2 和 a1 的重复记录。那可能吗?

4

2 回答 2

3

您必须有一个a1出现的副本B才能将其作为约束强制执行。如果您不希望您的用户看到它,您将创建一个_B包含所有Bs 列 +的表(例如 ),a1然后创建一个隐藏此列的视图(使用合适的插入触发器来填充a1) 。B

您还应该创建一个Aoverid和的超键a1,并在这两个列上使用外键约束(可能带有ON UPDATE CASCADE),B以确保此复制的列正确匹配A.

然后您是否决定这应该是唯一的外键,或者继续保持“正确”的外键(超过 just id),这是一个品味问题。


例如:

CREATE TABLE dbo.A (ID int not null,a1 int not null,a2 int not null,
    constraint PK_A PRIMARY KEY (id),
    constraint UQ_A_a1_check UNIQUE (id,a1)
)
CREATE TABLE dbo._B (ID int not null,a1 int not null,b1 int not null,b2 int not null,
    constraint PK_B PRIMARY KEY (a1,b1,b2),
    constraint FK_B_A FOREIGN KEY (id) references A (id),
    constraint DRI_B_A_a1_check FOREIGN KEY (id,a1) references A (id,a1) on update cascade
)
GO
CREATE VIEW dbo.B
WITH SCHEMABINDING
AS
    select id,b1,b2 from dbo._B
GO
CREATE TRIGGER T_B_I on dbo.B instead of insert
AS
    INSERT INTO dbo._B (id,a1,b1,b2)
    SELECT i.id,a.a1,i.b1,i.b2
    FROM
       inserted i
          inner join
       dbo.A a
          on
             i.id = a.id
GO
于 2012-05-23T07:50:09.110 回答
0

一种解决方案是为表 A 中的重复值创建一个函数测试,并添加一个将函数引用到表 B 的 Check 约束。

于 2012-05-23T07:50:24.810 回答