2010-12-04 3 views
1

Je travaille actuellement sur un grand projet web utilisant ASP et MySQL. Lors de l'insertion dans plusieurs tables, j'ai utilisé last_update_ID(), mais après quelques recherches, j'ai trouvé que cette instruction SQL n'est pas sûre.Existe-t-il une alternative à "last_update_ID()" pour mySQL?

Donc. le problème: J'utilise deux ordinateurs différents, avec des connexions Internet différentes.
Les deux ordinateurs sont connectés au système que je suis en train de construire. J'ai fait une page qui imprime le connection_id(), et last_update_id.
Si je mets à jour une table avec l'un des ordinateurs, l'autre reçoit également last_update_ID. Les deux ordinateurs ont le même ID de connexion.

Que puis-je faire pour contourner ce problème?

Je ne veux pas (si ce n'est pas nécessaire) faire une instruction select après le premier INSERT; pour rechercher la ligne que j'ai insérée, pour obtenir l'ID correct de cette ligne.

Ce n'est pas mon serveur que j'utilise donc je ne peux pas faire de grands changements dans la base de données.
Je suppose que ce problème se produit parce que les pages Web utilisent le même mot de passe & loginName pour se connecter à la base de données, est-ce vrai?

Existe-t-il une autre alternative pour obtenir le dernier ID de mise à jour? cela est totalement sûr. Je ferme chaque connexion à la fin de la page ASP. mais cela ne change pas le connection_ID.
L'ID de connexion est le pour quelques minutes même si j'ouvre différentes pages web sur le serveur.

Répondre

3

Je crois que le LAST_INSERT_ID() est correct pour la session en cours. Chaque session reçoit donc sa propre valeur correcte. Soit je ne comprends pas votre question ou vous pensez que vous avez un problème mais vous ne le faites pas.

Je ne connais pas de fonction LAST_UPDATE_ID(), sur une mise à jour, vous pouvez facilement récupérer les lignes mises à jour en les sélectionnant avec la même clause WHERE (avant la mise à jour)?

Référence: http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

Pour LAST_INSERT_ID(), le plus ID récemment généré est maintenu dans le serveur sur une base par connexion. Il n'est pas modifié par un autre client. Il n'est même pas modifié si vous mettez à jour une autre colonne AUTO_INCREMENT avec une valeur nonmagic (c'est-à-dire, une valeur n'est pas NULL et non 0). L'utilisation de LAST_INSERT_ID() et AUTO_INCREMENT colonnes simultanément à partir de plusieurs clients est parfaitement valide. Chaque client recevra le dernier ID inséré pour la dernière instruction exécutée .


Si vous voulez récupérer la LAST_INSERT_ID à partir d'une requête INSERT avec une clause KEY UPDATE Duplicate, vous pouvez également utiliser la fonction LAST_INSERT_ID() pour récupérer la valeur de la colonne AUTO_INCREMENT mise à jour:

référence: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Si une table contient une colonne AUTO_INCREMENT et INSERT ... UPDATE insère une ligne, la LAST_INSERT_I La fonction D() renvoie la valeur AUTO_INCREMENT. Si l'instruction met à jour une ligne à la place, LAST_INSERT_ID() n'est pas significatif. Toutefois, vous pouvez contourner ce problème par en utilisant LAST_INSERT_ID (expr). Supposons que cet ID est la colonne AUTO_INCREMENT. Pour faire LAST_INSERT_ID() significative pour les mises à jour, insérer des lignes comme suit:

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3; 
+0

En fait, je pense toujours avoir un problème .. J'utilise 2 ordinateurs différents et 2 connexions Internet différentes, et je suis toujours capable de récupérer le last_update_ID() de l'autre ordinateur que je mets à jour ou insère dans la table. – Matte

+0

Ensuite, la réponse de grahamparks s'applique très probablement à votre cas. Vous utilisez des connexions persistantes/pooling de connexion. Cependant, ils ne sont utilisés que de bout en bout. Vous voudrez peut-être lire sur le sujet. – ontrack

1

Votre serveur semble avoir la mise en commun de connexion activée. Cela signifie que la connexion à la base de données est maintenue ouverte après la fin d'un script et que le script suivant l'utilise et peut ainsi voir toutes les variables définies sur cette connexion, y compris LAST_INSERT_ID().

Ce qui ne peut pas arriver est deux instances de script partageant une connexion en même temps. Ainsi, si votre serveur est suffisamment occupé pour exécuter deux instances de script exactement au même moment, il créera simplement une deuxième connexion à la base de données, avec sa propre variable LAST_INSERT_ID(), et n'interférera pas avec la première. En résumé, tant que la requête INSERT et la requête LAST_INSER_ID() se produisent dans le même script (et que vous ne fermez pas la connexion de la base de données entre elles), elles sont totalement sécurisées, car votre script utilise exclusivement ce script. connexion.