如何在不使用触发器的情况下为一对多关系设置额外约束

How to set up an extra constraint for 1-to-many relationship without using triggers

我在当前位置遇到了一个数据库,至少可以说需要分配 TLC,有许多交叉引用 table 都具有相同的结构模式,并且都使用触发器来执行业务逻辑,或者它看起来的域完整性。我想弄清楚我是否可以用约束替换一些触发器。下面是符合此模式的典型 table 定义。这些 table 中大约有 400 个都使用相同的基于触发器的解决方案。

CREATE TABLE dbo.FooXRef
(
FooXRefID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
BarID INT NOT NULL CONSTRAINT [fk_Bar] FOREIGN KEY REFERENCES dbo.Bar(BarID),
DefaultRecord BIT NOT NULL CONSTRAINT [DF_FooXRef_Default] DEFAULT(1)
);

那里的规则可以在 BarIDDefaultRecord = 0 中存在无限数量的具有相同值的记录,但是在 BarID 在 [=] 中只能存在一条记录23=] 和 DefaultRecord = 1.

我需要设置什么类型的约束才能允许该组合?

这个 table 结构和触发器来强制执行这个组合在当前数据库中是 400 个,而在下一个数据库中,我将在数千个中进行。是否根本不可能设置适用于这种情况的约束?

这是一种不使用触发器的可能变体。

使用过滤条件 WHERE ([DefaultRecord]=(1)).

(BarID, DefaultRecord) 上创建过滤的唯一索引

有了这样的索引,您只能为每个 BarID 插入一行 DefaultRecord = 1.

具有 DefaultRecord = 1.

的行数可能为零

可以有任意数量的行 DefaultRecord = 0

CREATE UNIQUE NONCLUSTERED INDEX [IX_DefaultRecord] ON [dbo].[FooXRef]
(
    [BarID] ASC,
    [DefaultRecord] ASC
)
WHERE ([DefaultRecord]=(1))