Как сбросить значение идентичности sql в год? - PullRequest
2 голосов
/ 06 октября 2011

Привет, я работаю с приложением asp.net, которое связано с регистрацией студентов, данные, относящиеся к студентам, вставляются в базу данных, каждый раз, когда студент регистрируется, поле idStudent увеличивается на единицу,то, что я хочу сделать, - это когда новый год начинается, сбросьте стоимость студента, чтобы начать с 1 в новом году.

  • idStudent Год 1 2011 2 2011 3
    2011 4 2011 5 2011..... 1 2012 2
    2012 3 2012 .......

Как я могу это сделать?База данных находится в SQL Server 2008

Надеюсь на вашу помощь

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Если бы у меня было именно это требование к бизнесу, и я не смог бы договориться о более эффективном и эффективном способе, тогда я бы использовал такой подход:

Вместо использования искусственного ключа (то есть столбца identity)будет использовать составной ключ.Чтобы узнать, какой будет лучшая ставка для составного ключа, вам необходимо знать бизнес-правила и логику.Другими словами, вам нужно задать вопрос: уникальна ли комбинация года и идентификатора?Другими словами, в год идентификатор студента может использоваться только один раз ...?

Это один из тех случаев, когда вы могли бы воспользоваться естественным составным ключом.

0 голосов
/ 06 октября 2011

Вы можете добавить вычисляемый столбец, который выводит число на основе года.Вам просто нужно запустить скрипт ниже в начале нового года.Обратите внимание, что при откате транзакции в столбце идентификаторов будут пропуски.(и вставки в предыдущем году также создадут большие пробелы.)

-- test table & inserts
create table Students (Id int identity, year int, name varchar(20), StudentId int null)
insert into Students (year, name) values (2010, 'student1'), (2011, 'student1'), (2011, 'student2')

-- run this every year
EXEC ('ALTER TABLE Students DROP COLUMN StudentId ')
declare @count int, @sql varchar(max), @year int

declare c cursor local read_only 
for select year + 1, max(Id) from Students group by year

open c

fetch next from c into @year, @count
select @sql = 'when year = ' + convert(varchar(10), @year - 1) + ' then Id '+ CHAR(13) + CHAR(10)
while @@FETCH_STATUS = 0 
  begin
    select @sql = @sql + 'when year = ' + convert(varchar(10), @year) + ' then Id - ' + convert(varchar(10), @count) + CHAR(13) + CHAR(10)
    fetch next from c into @year, @count
  end
close c
deallocate c
select @sql = 'CASE ' + CHAR(13) + CHAR(10) + @sql + ' ELSE 0 END'
select @sql = 'ALTER TABLE Students ADD StudentId AS ' + isnull(@sql, 'Id') + '  PERSISTED'

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