4

在一个表中,我想确保在五列键上只存在唯一的值:

Timestamp Account RatingDate TripHistoryKey EventAction
========= ======= ========== ============== ===========
2010511   1234    2010511    1              INSERT
2010511   1234    2010511    4              INSERT
2010511   1234    2010511    7              INSERT
2010511   1234    2010511    1              INSERT   <---duplicate

我只希望在EventAction 为时在行之间应用唯一约束INSERT

Timestamp Account RatingDate TripHistoryKey EventAction
========= ======= ========== ============== ===========
2010511   1234    2010511    1              INSERT
2010511   1234    2010511    1              UPDATE
2010511   1234    2010511    1              UPDATE   <---not duplicate
2010511   1234    2010511    1              UPDATE   <---not duplicate
2010511   1234    2010511    1              DELETE   <---not duplicate
2010511   1234    2010511    1              DELETE   <---not duplicate
2010511   1234    2010511    1              INSERT   <---DUPLICATE

可能的?

4

4 回答 4

5

是的

  • SQL Server 2008:使用过滤索引
  • SQL Server 2005:使用触发器或索引视图

编辑:

于 2010-05-12T17:11:37.270 回答
2

什么是事件动作?

我怀疑您在这里遇到了设计问题,您可能需要考虑为每种类型的 EventAction 创建一个表/关系。例如,这样做将使您能够在 InsertEventAction 表上创建唯一约束。

也许您可以为您的问题提供业务背景。

继评论回复之后:鉴于数据源的性质和您希望实施的解析活动,我认为 gbn 建议了您的最佳选择。

遗憾的是源数据库不是 SQL Server,因为您可以使用触发器实现自己的审计机制。这样的解决方案可以在触发器中包含您的“过滤器”逻辑。

于 2010-05-12T17:14:46.573 回答
1

我会考虑使用检查约束来执行此操作。我不认为传统的唯一约束会起作用。

于 2010-05-12T17:09:35.697 回答
0

这是“INSTEAD OF INSERT”触发器的示例。EXISTS 检查是否存在具有相同值的现有行,但仅当 EventAction 为 INSERT 时。

CREATE TRIGGER [dbo].[YourTriggerName] ON [dbo].[YourTableName] 
   INSTEAD OF INSERT
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
  SET NOCOUNT ON;

  IF NOT EXISTS (
    SELECT 1
    FROM [YourTableName] L
    INNER JOIN inserted I ON
           I.Timestamp = L.Timestamp
       AND I.Account = L.Account
       AND I.RatingDate = L.RatingDate
       AND I.TripHistoryKey = L.TripHistoryKey
       AND I.EventAction = 'INSERT'
  )
  BEGIN
      INSERT INTO [YourTableName]
      SELECT * FROM inserted
  END
END
于 2010-05-12T19:19:33.910 回答