SQL Server插入语句以自动递增

时间:2012-02-24 20:55:26

标签: sql-server

我有一个SQL插入语句,如下所示:

insert into mytable(ID,Keyindex,KeyValue) 
select Id,1,GenreID 
from mytable2

哪个应该使用以下数据填充我的表格:

id                                      GenreID  ColumnB
0006342c-47bc-436a-a23a-3b40360d9a30    16       1
0006342c-47bc-436a-a23a-3b40360d9a30    19       1
00109775-f0f8-463e-8134-f842aac8b5df    12       1
001211e3-9bf8-45ad-8297-7a0a94aaf06e    13       1
0025218a-9624-4f5e-86cc-f1cfe862cd2a    16       1 
0025218a-9624-4f5e-86cc-f1cfe862cd2a    11       1
0025218a-9624-4f5e-86cc-f1cfe862cd2a    15       1

问题是ID,GenreId和ColumnB是主键,我当前正在插入一个constand值“1”,这会导致主键违规。

如果ID相同,我如何插入表中以使ColumnB填充值incremental。

例如:

id                                      GenreID  ColumnB
0006342c-47bc-436a-a23a-3b40360d9a30    16       1 
0006342c-47bc-436a-a23a-3b40360d9a30    19       2 
00109775-f0f8-463e-8134-f842aac8b5df    12       1
001211e3-9bf8-45ad-8297-7a0a94aaf06e    13       1
0025218a-9624-4f5e-86cc-f1cfe862cd2a    16       1
0025218a-9624-4f5e-86cc-f1cfe862cd2a    16       2
0025218a-9624-4f5e-86cc-f1cfe862cd2a    16       3

3 个答案:

答案 0 :(得分:1)

你的问题有点令人困惑。在“例如”部分中,0025218a-9624-4f5e-86cc-f1cfe862cd2a的genreID应该是16,17,19而不是16,16,16

假设我理解你是正确的,你可以使用{id}分区的ROW_NUMBER() OVER。以下内容应该有效:

insert into mytable(ID,Keyindex,KeyValue) 
select   id, GenreID , ROW_NUMBER() OVER (Partition by id order by id) as ColumnB
from     mytable2
order by id, 
         genereid

注意:您没有指定版本,但这可以在sql 2005 +

中使用

答案 1 :(得分:0)

肮脏的黑客将使用id - someNumberid + someNumber而不只是1

如果这是“一劳永逸”的一次性操作,可以接受什么。

如果必须检查唯一性,那么触发器就可以成为解决方案。

答案 2 :(得分:0)

您可以尝试ON DUPLICATE选项:

insert into mytable(ID,Keyindex,KeyValue) 
select Id,1,GenreID 
from mytable2
ON DUPLICATE KEY UPDATE Keyindex = Keyindex+1;