2012-02-24 108 views
2

我有一个SQL INSERT语句如下所示:SQL Server的INSERT语句自动增量

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是主键,我正在插入一个常量值“1”,导致主键违规。

如何插入表格,使得ColumnB得到一个值incrementaly如果ID是相同的填充。

例如:

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

工作,这RDBMS使用的是? – 2012-02-24 20:57:15

+0

第一部分中的列名与第二部分中显示的名称不同步。 – 2012-02-24 20:58:57

+1

因此,如果GenreID和ColumnB的组合不会唯一,那么您只需要ColumnB增量?听起来就像你需要一个触发器。 – davidethell 2012-02-24 21:00:25

回答

0

一个肮脏的黑客是使用id - someNumberid + someNumber,而不是仅仅1

如果这是一次“火灾和遗忘”一次性操作,可接受什么?

如果您必须检查唯一性,那么触发器就是解决方案。

-1

你可以尝试对重复选项:

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

注意这是未经测试的。只是一个快速的想法。根据需要修改。 – davidethell 2012-02-24 21:04:17

+0

如果你不使用MySQL,看看这个链接:http://stackoverflow.com/questions/1197733/does-sql-server-offer-anything-like-mysqls-on-duplicate-key-update – diaho 2012-02-24 21:07:19

+0

消息156 ,级别15,状态1,行2 关键字'ON'附近的语法错误。 – Milligran 2012-02-24 21:39:37

1

你的问题是有点混乱。在“例如”部分,它看起来像0025218a-9624-4f5e-86cc-f1cfe862cd2a的genreID应该是16,17,19而不是16,16,16

假设我理解你正确的,不过,你可以使用ROW_NUMBER() OVER由ID划分。像下面这样的东西应该工作:

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+