表中的多个序列ID号

时间:2011-01-07 10:00:24

标签: sql-server tsql

我在SQL Server 2005中有一个表,其中包含许多项目的一些更改日志数据。它们存储在一个表中,因为有数百个项目,可以查询项目日志表,例如每天或每人的活动。

例如
projectlogidentity int identity
projectname nvarchar(100)
projectchanged datetime
projectchangedby nvarchar(100)
projectserial int

projectname和projectserial上有索引

我希望在添加行时为每个项目生成一个顺序项目序列

例如:

0 |咖啡店| 2011年1月7日08:13 |德里克| 0
1 |迪斯科| 2011年1月7日08:18 |艾玛| 0
2 |咖啡店| 2011年1月7日08:19 |彼得| 1
3 |迪斯科| 2011年1月7日09:11 |艾伦| 1
4 |咖啡店| 2011年1月7日09:42 | tess | 2

因此,当通过projectname检索单个项目的行时,对于该项目名的每一行都有一个持久的顺序序列号。

插入我目前所做的行后:

update projectlog set projectserial=1+
(select isnull(max(projectserial),0) from projectlog 
where projectname='coffee shop') where (projectlogidentity=4);

但是当这个表包含数十万行和数百个项目时,我担心性能。还有更好的方法吗?

感谢

德里克

2 个答案:

答案 0 :(得分:1)

我认为你可以使用两张表来表现。

projectlog 
----------
projectlogidentity int identity
projectnameid int
projectchanged datetime
projectchangedby nvarchar(100)
projectserial int


projectlog_projectname
----------------------
id int
name nvarchar(100)
serial int

UPDATE projectlog SET projectserial = 1 + (SELECT ISNULL(serial, 0) FROM projectlog_projectname WHERE projectname='coffee shop')
WHERE projectlogidentity = 4;
UPDATE projectlog_projectname SET serial += 1 WHERE projectname='coffee shop'

答案 1 :(得分:0)

使用触发器,它是eaxclty为

创建的内容
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'Incrementprojectserial' AND type = 'TR')
   DROP TRIGGER IncrementProjectserial
GO
CREATE TRIGGER IncrementProjectserial
ON projectlog 
FOR INSERT   
AS 

DECLARE @projectname varchar(10) --whatever you datatype is
DECLARE @projectlogidentity int  
DECLARE @Maxprojectserial int

-- GET YOUR INSERTED VALUES
SELECT @projectname = projectname FROM INSERTED
SELECT @projectlogidentity = projectlogidentity FROM INSERTED

--GET YOUR PREVIOUS projectserial
SELECT @projectserial = isnull(max(projectserial),0) 
FROM projectlog  
WHERE projectname=@projectname) 

--UPDATE YOUR NEW VALUE
UPDATE projectlog SET projectserial = @Maxprojectserial + 1
WHERE projectlogidentity = @projectlogidentity 

GO

这是一个完整的msdn文档