2009-05-16 5 views
3

J'insère une ligne avec une colonne char pour un hachage basé (entre autres) sur l'identifiant automatique de la ligne. Je sais que je peux l'insérer, aller chercher l'insert_id, calculer le hash et le mettre à jour.MySQL current_insert_id()? (Pas last_insert_id())

Est-ce que quelqu'un connaît un moyen de le faire dans une seule requête? Vous auriez besoin des lignes insert_id au moment de l'insertion. Est-ce complètement impossible, ou y at-il quelque chose comme current_insert_id() ...

Merci!

+0

Je suis curieux, pourquoi auriez-vous besoin d'une colonne avec un hachage généré à partir de la clé des lignes? – duckyflip

+0

Dans ce cas, ce n'est en fait pas un hachage, mais une clé publique semi-lisible, faite de la clé de la ligne dans la base 36, ajoutée à d'autres choses. Il est utilisé comme clé publique dans les formulaires et autres endroits où j'ai besoin d'une clé unique pour identifier la ligne, mais je ne veux pas exposer l'identifiant de ligne réel, ni montrer un modèle prévisible. – Eli

Répondre

11

Non, il n'y a pas de fonction dans MySQL qui vous donne le current_insert_id(). La seule façon d'obtenir une valeur d'ID générée à partir d'un champ AUTO_INCREMENT dans MySQL est de faire le INSERT, puis d'appeler last_insert_id(). Donc, votre plan de faire une mise à jour séparée pour calculer le hachage est probablement ce que vous aurez à faire.

je peux penser à deux autres alternatives:

  • Generate la valeur unique vous-même avant l'INSERT avec un autre mécanisme en dehors du AUTO_INCREMENT. Par exemple, voir la fonction UUID().

    SET @id = SELECT UUID(); 
    INSERT INTO MyTable (id, hash) VALUES (@id, hash(@id...)); 
    
  • N'incluez pas l'ID dans votre calcul de hachage.

2

Il n'y a aucun moyen que je connaisse pour le faire dans MySQL dans une requête, mais vous pouvez faire quelque chose comme ça dans votre langage de script côté serveur de choix:

<?php 

$query = mysql_query("SHOW TABLE STATUS LIKE 'MyTable'"); 
$row = mysql_fetch_assoc($query); 
$next_id = $row['Auto_increment']; 

?> 

... ce qui vous donne l'identifiant à intégrer dans votre SQL. J'ai également trouvé this answer qui peut être utile.

+1

Ceci est susceptible à une condition de concurrence. –

0

Quand je fais des inserts je fais quelque chose comme ceci:

INSERT INTO table (col1,col2) VALUES (data1,data2);SELECT LAST_INSERT_ID()

et il suffit d'exécuter la requête comme je l'extraction de données. Dans VB.NET la syntaxe est (en supposant que vous avez le .dll MySql.Data.MySqlClient):

Dim sql As String = "[sql string above]" 
Dim dr As MySqlDataReader = YourRetrieveDataFunction(sql) 

dr.Read() 
yourObjectInstance.ID = dr(0) 
dr.Close 

Il est techniquement deux requêtes, mais un seul coup sur la base de données :)

+0

Eli veut que l'identifiant * sur * soit inséré, pas celui qui vient d'être inséré. – da5id

+0

hmm ... SELECT quel que soit, (SELECT id + 1 FROM table ORDER BY id DESC DESCIT 1) Comme newid ....? Je ne sais pas si cela fonctionne réellement – Jason

+0

ok je viens de l'essayer ... sous-requêtes à la rescousse! – Jason

1

Vous pouvez interroger la valeur la plus proche de la information_schema. TABLES, la colonne AUTO_INCREMENT là. (Vous vous préparez peut-être à une condition de concurrence?)

+1

Oui, ce serait susceptible de subir une condition de concurrence. –

Questions connexes