我有一个有两列的表,其中没有列是唯一的。我需要为每个用户分别自动递增列number
。SQL Server:分别自动增加字段
user | number
1 | 1
2 | 1
1 | 2
3 | 1
我想出的唯一想法是搜索最后使用的数字并手动递增1。有没有更高效的方法?
我有一个有两列的表,其中没有列是唯一的。我需要为每个用户分别自动递增列number
。SQL Server:分别自动增加字段
user | number
1 | 1
2 | 1
1 | 2
3 | 1
我想出的唯一想法是搜索最后使用的数字并手动递增1。有没有更高效的方法?
取而代之的是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
搜索用户最大值并增加它。
INSERT INTO YOUR_TABLE (user, number)
SELECT (MAX(number) + 1)
FROM YOUR_TABLE
WHERE user = USER_ID
自动递增的术语只覆盖主键自动递增。有关更多信息,请参阅this page。
'只有主键'我不会那么肯定。我可以使用自动增加的值来设置非PK列 –
OP已经观察到这是一个选项,正在寻找其他人。 –
这可以工作,直到遇到并发问题。 –
您可以通过两种查询做到这一点,如:
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);
您可以编写一个计算自动增量的函数,并使[number]成为调用函数的计算列。 –
创建一个单独的表,保存每个用户的数量,如果您的当前表的行数比用户多得多,则可以更好地保留每个用户的数字 –