2012-03-28 3 views
3

Est-il possible de définir la valeur d'un champ d'incrémentation automatique? Si un enregistrement est supprimé avec la clé primaire 5, mais que le compte d'incrémentation automatique actuel est 10, est-il possible de réinsérer cet enregistrement avec sa clé primaire restant à 5 (au lieu de 11)? J'essaye de faire ceci avec Entity Framework 4.1 en C#.Comment réattribuer une valeur de clé primaire à incrémentation automatique?

Répondre

0

Bien qu'il y ait eu plusieurs bonnes suggestions ici, j'ai réalisé plusieurs choses tout en travaillant avec la solution à cette question. La divulgation que la base de données était un MySQL aurait peut-être aidé ici, mais je ne me suis pas rendu compte à l'époque que la différence serait si importante. En fait, dans MySQL, il n'y a pas de verrou contre l'insertion dans une clé primaire auto-incrémentée. En conséquence, ce code fonctionne pour insérer un enregistrement avec une clé primaire inférieure à la valeur actuelle de l'indice auto-increment:

 var sql = @"INSERT INTO Work (
      WorkId , 
      LotId , 
      Description , 
      ) 
      VALUES (
      '5', '5', 'This Works' 
      );"; 
     using (var db = new Context()) 
     { 
      db.Database.ExecuteSqlCommand(sql); 
     } 

insérer correctement un enregistrement avec l'indice 5, même si le courant automatique le nombre d'incrément est à 11.

+0

Il y en a qui se demanderaient si jamais cela serait nécessaire, car il est rare que ce cas se produise, et mon usage sera d'imp lement une fonction de restauration où un enregistrement peut être restauré avec sa clé primaire d'origine. –

2

Cité de Tom Haigh:

You could drop the primary key column and re-create it. All the ids will then be reassigned, I assume in the order in which the rows were inserted.

However, I'm not sure why you'd want to do this, especially if you have other tables that hold a foreign key to this table. If so you would need to update those fields as well, in which case dropping and recreating the column wouldn't be a good solution. You could instead re-name the column, remove the autoinc/primary key property, then create a new autoinc primary key column. You then would have both the old and new ids which you could use to update such foreign keys.

+0

J'avais effectivement lu la réponse de cette personne avant, et il semblait que maintenant et maintenant être surpuissant. –

5

Je pense que vous pouvez également utiliser

Set Identity_Insert TableName ON 
Update your Id value 
Set Identity_Insert TableName OFF 
+0

Cela semble être une très bonne suggestion. Je vais devoir comprendre comment exécuter ce SQL brut en C# et si cela fonctionne, je vais marquer cela comme la réponse. –

+0

J'ai eu cette erreur: 'Exception Détails: MySql.Data.MySqlClient.MySqlException: variable système inconnue 'Identity_Insert'' –

+0

@TravisJ pouvez-vous poster la commande SQl que vous utilisez? – NiK

1

Vous pouvez désactiver le identity specification. Votre clé primaire resterait intacte mais vous pourriez insérer un nouvel enregistrement avec un identifiant de votre choix. Après avoir inséré l'enregistrement, vous souhaitez réactiver la spécification d'identité.

Questions connexes