我在 Sql Server 中有一个表,其中有列:UserId、RoleId、FromDate 和 Todate。我想写一个检查相同的 RoleId 和 UserId 在同一日期不存在的约束。
提前致谢....
我在 Sql Server 中有一个表,其中有列:UserId、RoleId、FromDate 和 Todate。我想写一个检查相同的 RoleId 和 UserId 在同一日期不存在的约束。
提前致谢....
如果您没有时间部分或所有记录中的时间部分都相同,则可以使用UNIQUE
约束:
ALTER TABLE yourSchema.yourTable
ADD CONSTRAINT uniqueConstraint1 UNIQUE (RoleId, UserId, FromDate);
这样 date、RoleId 和 UserId 的组合只能在表中出现一次,其他插入相同组合的尝试将失败。
请注意,如果您的日期字段的时间部分的值在每条记录中都相同(例如 0),或者该字段的数据类型是DATE
(消除了时间部分),这将起作用。
如果您的日期字段的时间部分因记录而异,请尝试以下方法之一:
A)添加定义的计算列
ALTER TABLE yourSchema.yourTable
ADD constraintCheckDate AS CAST(FromDate AS DATE)
并添加UNIQUE
定义约束
ALTER TABLE yourSchema.yourTable
ADD CONSTRAINT uniqueConstraint1 UNIQUE (RoleId, UserId, constraintCheckDate)
B)在插入数据之前使用触发器验证数据,只有当数据不存在时才会输入数据:
CREATE TRIGGER trig1 ON yourSchema.yourTable
INSTEAD OF INSERT
AS
BEGIN
IF NOT EXISTS
(
SELECT *
FROM yourSchema.yourTable t
JOIN inserted i ON
CAST(t.FromDate AS DATE) = CAST(i.FromDate AS DATE)
AND t.RoleId = i.RoleId
AND t.UserId = i.UserId
)
INSERT yourTable(RoleId, UserId, FromDate, ToDate)
SELECT RoleId, UserId, FromDate, ToDate
FROM inserted
ELSE
RAISERROR('Error', 16, 0)
END
GO