根据SQL中的某些条件触发自动递增ID

时间:2013-08-08 12:21:23

标签: sql-server tsql triggers

我想编写一个触发器,以便当新记录进入时,如果它的某些列包含与前一个记录相同的内容,则所有现有条目的一个特定ID列将增加1,新条目将增加为0,如果没有现有记录,则自动将新记录分配给该列中的ID为0。

例如,假设我现有的数据是这样的:

FirstName  LastName  InvoiceID  Amt
-----------------------------------
John        Doe       1         $5
Bill        Jane      0         $6
John        Doe       0         $3

现在说我要用3.5美元的发票插入John Doe,然后记录将自动变为:

FirstName  LastName  InvoiceID  Amt
-----------------------------------    
John        Doe       1         $5
Bill        Jane      0         $6
John        Doe       2         $3
John        Doe       0         $3.5

现在,如果我需要插入一个新人,比如简史密斯说2美元,那就会变成:

FirstName  LastName  InvoiceID  Amt
--------------------------------------
John        Doe       1         $5
Bill        Jane      0         $6
John        Doe       2         $3
John        Doe       0         $3.5
Jane        Smith     0         $2

我是否应该知道如何在T-SQL中编写这样的触发器?

谢谢!

1 个答案:

答案 0 :(得分:2)

这是我要做的,而不是触发器:

create table T (TID int IDENTITY(1,1) not null,FirstName varchar(10) not null,LastName varchar(10) not null,Amt decimal(18,4) not null)
go
create view V
as
    select
        FirstName,
        LastName,
        ROW_NUMBER() OVER (PARTITION BY FirstName,LastName ORDER BY TID desc) - 1 as InvoiceID,
        Amt
    from
        T
go

然后设置您的初始数据:

insert into T(FirstName,LastName,Amt) values
('John','Doe',5),
('Bill','Jane',6)
go
insert into T(FirstName,LastName,Amt) values
('John','Doe',3)

新的John Doe行:

insert into T(FirstName,LastName,Amt) values
('John','Doe',3.5)

最后是简史密斯的一行:

insert into T(FirstName,LastName,Amt) values
('Jane','Smith',2)

然后从视图中选择:

FirstName  LastName   InvoiceID            Amt
---------- ---------- -------------------- ---------------------------------------
Bill       Jane       0                    6.0000
Jane       Smith      0                    2.0000
John       Doe        0                    3.5000
John       Doe        1                    3.0000
John       Doe        2                    5.0000

所以我们不担心InvoiceID可能不正确,因为我们从不存储它。

select * from V