2015-06-25 88 views
3

我有一个有两列的表,其中没有列是唯一的。我需要为每个用户分别自动递增列numberSQL Server:分别自动增加字段

user | number 
1 | 1 
2 | 1 
1 | 2 
3 | 1 

我想出的唯一想法是搜索最后使用的数字并手动递增1。有没有更高效的方法?

+1

您可以编写一个计算自动增量的函数,并使[number]成为调用函数的计算列。 –

+5

创建一个单独的表,保存每个用户的数量,如果您的当前表的行数比用户多得多,则可以更好地保留每个用户的数字 –

回答

4

取而代之的是number场,您可以在表中创建一个auto increment场(我称之为id),并通过查询获取所需的number

第一添加ID:

alter table table_name add id int not null IDENTITY(1,1) 

您不需要数字字段了:

alter table table_name drop column number 

查询得到number(you c一个使用它来创建一个视图):

select user, 
row_number() over(partition by user order by id) as number 
from table_name 
1

搜索用户最大值并增加它。

INSERT INTO YOUR_TABLE (user, number) 
SELECT (MAX(number) + 1) 
FROM YOUR_TABLE 
WHERE user = USER_ID 

自动递增的术语只覆盖主键自动递增。有关更多信息,请参阅this page

+2

'只有主键'我不会那么肯定。我可以使用自动增加的值来设置非PK列 –

+1

OP已经观察到这是一个选项,正在寻找其他人。 –

+0

这可以工作,直到遇到并发问题。 –

1

您可以通过两种查询做到这一点,如:

userno - 在要插入

第一次写入整数的用户ID(查询1)也就是说,如果userno已经存在于表:

insert into table_name 
select userno,count(*) from table_name where user = userno 
group by user; 

如果它返回一个空行,然后简单的写(查询2),即它要插入一个新的用户:

insert into table_name values(userno,1);