J'ai une instruction d'insertion SQL comme celle-ci:
insert into mytable(ID,Keyindex,KeyValue) select Id,1,GenreID from mytable2
Ce qui devrait remplir ma table avec des données comme:
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
Le problème est ID, GenreId et ColumnB sont des keys primaires et j'insère actuellement une valeur constand "1" qui entraîne une violation de key primaire.
Comment puis-je insert dans la table afin que ColumnB soit rempli avec une valeur incrémentielle si les ID sont identiques.
Par exemple:
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
Votre question est un peu confuse. Dans la section "par exemple", il semble que le genreID pour 0025218a-9624-4f5e-86cc-f1cfe862cd2a
devrait être 16,17,19
au lieu de 16,16,16
.
En supposant que je vous comprenne bien, vous pouvez utiliser ROW_NUMBER() OVER
partitionné par l'ID. Quelque chose comme ce qui suit devrait fonctionner:
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
Note: vous n'avez pas spécifié de version, mais cela fonctionnera dans sql 2005+
Un hack sale serait d'utiliser id - someNumber
ou id + someNumber
au lieu de seulement 1
.
Ce qui peut être accepté s'il s'agit d'une opération «feu et oublie» une fois.
Si vous devez vérifier l'unicité, un triggersur peut être la solution.
Vous pouvez essayer l'option ON DUPLICATE:
insert into mytable(ID,Keyindex,KeyValue) select Id,1,GenreID from mytable2 ON DUPLICATE KEY UPDATE Keyindex = Keyindex+1;