Page 1 sur 1

Connaitre la valeur de l'ID du dernier enregistrement dans u

Posté : 20 août 2007, 00:42
par stakanof
J'ai une table produit, avec les champs suivant:

Code : Tout sélectionner

ID_PRODUIT NOM PRIX_HT DESCRITION QUANTITE_STOCK URL_PHOTO ID_PRODUIT est en autoincrement,
Quand j'ajoute un produit à la table, je voudrais connaitre l'ID_PRODUIT du dernier enregistrement
avant d'insérer le produit ?

Bon avec cette requette : j'ai ma solution

Code : Tout sélectionner

SELECT id_produit FROM `produit` ORDER BY id_produit DESC LIMIT 0 , 1
Y a t'il une fonction pour faire ça ?

Posté : 20 août 2007, 01:13
par Sékiltoyai
Est ce que cette information t'es vraiment utile ? Tu n'as pas besoin de cela pour insérer ton nouvel enregistrement si justement ton champ est en autoincrement…

Posté : 20 août 2007, 01:27
par stakanof
En fait je veux construire le champ URL_PHOTO avec l'ID de l'enregistrement

Posté : 20 août 2007, 02:37
par Sékiltoyai
Oui mais pourquoi l'enregistrement précédant celui que tu veux insérer ? Les données que tu insères dépendent de cette information ?

Posté : 20 août 2007, 09:02
par stakanof
J'ajoute 1 et j'ai l'id de l'enregistrement , ainsi je peux creer une URL qui depend de l'ID de l'enregistrement.

Posté : 20 août 2007, 09:25
par zeus
Alors, plusieurs remarques ...

1/ Ta requête ne me semble pas super optimisée. J'aurais fait un

Code : Tout sélectionner

SELECT MAX(id_produit) FROM produit
2/ Si je part du fait que tu utilises MySQL (il y a des recommandations lors de la création d'un nouveau post, c'est pas pour faire joli :evil:), il existe la fonction mysql_insert_id() qui permet de récupérer l'identifiant d'une ligne qui vient d'être inséré.

3/ Sinon, dans ta manière de faire (récupérer le plus grand et l'incrémenter), je voulais te montrer une faille :
  • Tu as 10 enregistrements dans ta table, la valeur courante de l'auto_increment est 10
  • Tu ajoutes un enregistrement, l'id_produit est 11, la valeur courante de l'auto_increment est donc 11
  • Tu supprimes ce dernier enregistrement, le plus grand id_produit est donc 10 mais la valeur courante de l'auto_increment reste 11
  • Tu ajoutes un nouvel enregistrement, son id_produit est 12 mais ta requête t'as retourné 11
Même si, dans l'immédiat, tu ne comptes pas supprimer d'enregistrements dans cette table, il me semble que c'est un soucis assez grave (risque de rupture de l'intégrité de ta base de données) pour le prendre en compte tout de suite.
MySQL te propose une gestion automatique des auto_increment, profite-en plutôt que de vouloir réinventer la roue ;)

Posté : 20 août 2007, 09:36
par stakanof
ok, merci :D

Posté : 20 août 2007, 13:00
par Sékiltoyai
Si je part du fait que tu utilises MySQL (il y a des recommandations lors de la création d'un nouveau post, c'est pas pour faire joli :evil:), il existe la fonction mysql_insert_id() qui permet de récupérer l'identifiant d'une ligne qui vient d'être inséré.
Ouais, mais je ne sais pas si j'ai bien compris, mais j'ai l'impression qu'il veut utiliser l'insert id dans les données qu'il est en train d'insérer, et c'est là tout le problème… Je pense tout de même qu'il sera obligé soit d'abandonner l'idée d'utiliser l'id dan les données (après tout elle y est déjà), soit de refaire une requète ensuite. (à moins qu'il y ait une autre solution mais j'en doute)
Le mieux, se serait stakanof que tu nous expliques pourquoi tu en as absolument besoin. Car j'ai l'impression que la donnée dont tu parles qui utiliserait l'insert id peut parfaitement être généré lorsque tu récupères l'enregistrement, en utilisant l'id courante.

Posté : 20 août 2007, 13:24
par zeus
C'est possible ... :-k

J'étais parti du fait qu'il voulais insérer un enregistrement dans la table T1 puis un enregistrement dans la table T2 avec une clé étrangère sur l'enregistrement de la table T1 qui vient d'être créé.
Et là, à part le transactionnel, je ne vois pas ... :? (Je pars du fait qu'il ne dispose pas de MySQL 5.0, par expérience ... :oops: )

Posté : 20 août 2007, 16:41
par Sékiltoyai
En transactionel, tu ferais comment, comme ça ?

Code : Tout sélectionner

BEGIN INSERT INTO table VALUES(donnee1, donnee2, …); UPDATE table SET champ=CONCAT('photo.php?ID=', LAST_INSERT_ID()) WHERE id=LAST_INSERT_ID(); // Apparement il voulait stocker une URL. COMMIT

Posté : 20 août 2007, 16:47
par zeus
Je préfèrerais utiliser un déclencheur qui me donnerais l'id à utiliser puis me servir de cet id pour l'INSERT et l'UPDATE

Posté : 20 août 2007, 16:53
par Sékiltoyai
Ah ok, je vois, je ne connaissais pas cette fonctionnalité…