如何在不使用触发器的情况下为一对多关系设置额外约束
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)
);
那里的规则可以在 BarID
和 DefaultRecord = 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))
我在当前位置遇到了一个数据库,至少可以说需要分配 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)
);
那里的规则可以在 BarID
和 DefaultRecord = 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))