我有一个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
答案 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 - someNumber
或id + 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;