несколько серийных номеров в таблице - PullRequest
0 голосов
/ 07 января 2011

У меня есть таблица в SQL Server 2005, которая содержит некоторые данные журнала изменений для ряда проектов.Они хранятся в одной таблице, так как существуют сотни проектов, и к таблице журнала проектов можно запрашивать такие вещи, как активность в день или на человека.

Например
projectlogidentity int identity<br> projectname nvarchar(100)<br> projectchanged datetime<br> projectchangedby nvarchar(100)<br> projectserial int

Естьиндексы для имени проекта и серии проектов

Я хочу создать серию проектов для каждого проекта по мере добавления строк

например:

0 |кофейня |7 января 2011 08:13 |Дерек |0
1 |дискотека |7 января 2011 08:18 |эмма |0
2 |кофейня |7 января 2011 08:19 |питер |1
3 |дискотека |7 января 2011 09:11 |алан |1
4 |кофейня |7 января 2011 г. 09:42 |Тесс |2

Таким образом, при извлечении строк для одного проекта по имени проекта существует постоянный последовательный серийный номер для каждой строки, определенной для этого имени проекта.

После вставки строки, которую я в настоящее время выполняю:

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

но я беспокоюсь о производительности, когда эта таблица будет содержать сотни тысяч строк и сотни проектов.Есть ли лучший способ?

спасибо

Дерек

Ответы [ 2 ]

1 голос
/ 07 января 2011

Я думаю, вы можете использовать две таблицы для производительности.

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'
0 голосов
/ 07 января 2011

Используйте триггер, это как раз то, для чего он создан

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 документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...