2012-02-21 4 views
0

Existe-t-il un équivalent à PHP mysql_insert_id pour récupérer la dernière clé primaire UUID() insérée? (Je reçois toujours 0. Cela fonctionne pour les entiers auto_inc cependant)PHP mysql_insert_id() pour les clés primaires MySQL UUID()?

+1

Je ne pense pas que, malheureusement, il y a. De même, cessez d'utiliser les fonctions mysql_ * et utilisez plutôt les fonctions mysqli_ * ou les objets PDO. –

+0

bien, autre que le support de rupture pour les installations php héritées ... y at-il quelque chose dans PDO pour cela? – ina

+0

comment «héritage» parlons-nous? [Mysqli] (http://us.php.net/manual/fr/book.mysqli.php) est assez bien supporté. –

Répondre

0

Non, last_insert_id() récupère uniquement les derniers champs auto_increment générés. Vous devrez d'abord faire un select uuid(), puis faire un insert en utilisant cet uuid. Cependant, notez que les uuids ne peuvent pas être garantis uniques - ils sont tout simplement très peu susceptibles d'entrer en collision. Si vous avez besoin d'unicité, alors allez avec un auto_increment - ils ne seront jamais réutilisés dans une seule table.

+1

Je pensais que l'auto_increment échouait lorsque vous partagiez avec différents serveurs, d'où l'utilisation des UUID? – ina

+0

@ina oui, sharding (que ce soit ou non à des serveurs différents) peut provoquer l'échec de l'auto_increment, si vous changez de partition. Mais, lorsque vous partitionnez ("shard") une table, votre PK devient effectivement la valeur auto_increment plus la colonne sur laquelle vous partitionnez. –

+0

J'essaie toujours de comprendre pourquoi de nombreux systèmes utilisent l'UUID pour l'identifiant principal d'un utilisateur. Je pensais que c'était parce qu'ils supposaient que la base de données évoluerait sur différents serveurs, et l'adresse mac dans l'UUID aide à déterminer sur quel serveur les données sont. Mais, si un identifiant est garanti unique et peut évoluer, pourquoi utiliser les UUID. – ina

0

Je trouve cette solution assez courte et simple:

set @id=UUID(); 
insert into <table>(<col1>,<col2>) values (@id,'another value'); 
select @id; 
Questions connexes