触发具体值?

时间:2012-07-02 21:28:39

标签: sql-server triggers

我在Stack上已经阅读了一些问题/答案,但找不到我需要的东西 假设我有下表:

col0  col1  col2  col3  col4
----  ----  ----  ----  ----
8     1     a     b     c
8     2     a     b     c
8     3     a     b     c
9     1     a     b     c
9     2     a     b     c

我的软件确实:

INSERT INTO testtable ([col0],[col1],[col2],[col3],[col4]) 
  VALUES ('8','4','a','b','c')

如何创建类似此伪代码的触发器:

On insert when col1 = '4'
  delete existing rows where col0 is the same (8 in this case)
   ** except for the new row I've just added **

2 个答案:

答案 0 :(得分:1)

试试这个(在测试服务器上):

DELETE FROM TESTTABLE T1
    JOIN INSERTED T2
        ON T1.COL1 = T2.COL1
        AND T1.COL0 = T2.COL0

答案 1 :(得分:1)

在一个触发器中执行此操作听起来更合适。如果目标是我假设的:当插入col0 = 8的新行时,你想删除具有相同键的所有其他行,是吗?

CREATE TRIGGER dbo.testtable_instead_insert
ON dbo.testtable
INSTEAD OF INSERT
AS
BEGIN
  SET NOCOUNT ON;

  DELETE t 
    FROM dbo.testtable AS t
    INNER JOIN inserted AS i
    ON t.col0 = i.col0
    WHERE i.col1 = '4';

  INSERT dbo.testtable(col0,col1,col2,col3,col4)
    SELECT col0,col1,col2,col3,col4
      FROM inserted;
END
GO

问题是,如果插入尝试添加具有相同col0值的多个行,您希望遵循什么规则?想象一下插入语句是:

INSERT dbo.testtable ([col0],[col1],[col2],[col3],[col4]) 
SELECT '8','4','a','b','c'
UNION ALL 
SELECT '8','3','c','d','e';