SQL 对列值的约束取决于其他列的值
SQL Constraint on column value depending on value of other column
首先,我有简单的 [SomeType]
table,包含列 [ID]
和 [Name]
。
我还有 [SomeTable]
table,字段如下:
[ID],
[SomeTypeID] (FK),
[UserID] (FK),
[IsExpression]
最后,我必须在数据库层上做一个约束:
- 对于具体的
[SomeType]
个 ID(实际上,对于除一个之外的所有 ID),
- 同样
UserID
,
- 只有一个条目应该
[IsExpression]
等于 1
(IsExpression
属于 BIT
类型)
不知道是不是复杂条件,不知道怎么写。您将如何实施此类约束?
您可以使用过滤索引执行此操作:
CREATE UNIQUE NONCLUSTERED INDEX [IDX_SomeTable] ON [dbo].[SomeTable]
(
[UserID] ASC
)
WHERE ([SomeTypeID] <> 1 AND [IsExpression] = 1)
或:
CREATE UNIQUE NONCLUSTERED INDEX [IDX_SomeTable] ON [dbo].[SomeTable]
(
[UserID] ASC,
[SomeTypeID] ASC
)
WHERE ([SomeTypeID] <> 1 AND [IsExpression] = 1)
取决于您要实现的目标。一个用户只有一个 [IsExpression] = 1
而不考虑 [SomeTypeID]
或者你只想一个用户有一个 [IsExpression] = 1
和一个 [SomeTypeID]
.
首先,我有简单的 [SomeType]
table,包含列 [ID]
和 [Name]
。
我还有 [SomeTable]
table,字段如下:
[ID],
[SomeTypeID] (FK),
[UserID] (FK),
[IsExpression]
最后,我必须在数据库层上做一个约束:
- 对于具体的
[SomeType]
个 ID(实际上,对于除一个之外的所有 ID), - 同样
UserID
, - 只有一个条目应该
[IsExpression]
等于 1
(IsExpression
属于BIT
类型)
不知道是不是复杂条件,不知道怎么写。您将如何实施此类约束?
您可以使用过滤索引执行此操作:
CREATE UNIQUE NONCLUSTERED INDEX [IDX_SomeTable] ON [dbo].[SomeTable]
(
[UserID] ASC
)
WHERE ([SomeTypeID] <> 1 AND [IsExpression] = 1)
或:
CREATE UNIQUE NONCLUSTERED INDEX [IDX_SomeTable] ON [dbo].[SomeTable]
(
[UserID] ASC,
[SomeTypeID] ASC
)
WHERE ([SomeTypeID] <> 1 AND [IsExpression] = 1)
取决于您要实现的目标。一个用户只有一个 [IsExpression] = 1
而不考虑 [SomeTypeID]
或者你只想一个用户有一个 [IsExpression] = 1
和一个 [SomeTypeID]
.