2010-09-14 8 views
3

Je veux utiliser PHP et MySQL pour insérer des données dans une table de données et dans sa table plusieurs-à-plusieurs associée. L'ID principal auto-incrémenté de la table de données est utilisé dans la table plusieurs-à-plusieurs. Donc, j'ai besoin de connaître les ID de la table de données à insérer dans la table many-to-many. Ma pensée actuelle est que la meilleure façon d'aborder cela est avec une boucle, qui serait d'abord insérer dans la table de données, puis utiliser mysql_insert_id() pour insérer dans la table plusieurs-à-plusieurs. Est-ce la meilleure façon d'y arriver?Utiliser mysql_insert_id pour insérer beaucoup de données

De plus, dois-je m'inquiéter d'obtenir le mauvais identifiant avec cette fonction? Beaucoup de travailleurs utiliseraient ce script de données en même temps, donc mon inquiétude est qu'un ID d'une requête de travail finirait par être renvoyé dans l'appel à mysql_insert_id() d'un autre. Est-ce une préoccupation légitime et si oui, comment puis-je y faire face?

+1

D'où proviennent ces données que vous souhaitez insérer? Cela peut aider à définir les types de requêtes avec lesquelles nous pouvons travailler –

+1

'mysql_insert_id()' ne retournera pas le dernier identifiant d'insertion d'un autre thread, donc votre approche sera multi-process safe. – staticsan

Répondre

3

Appeler mysql_insert_id() sur une table avec un ID auto_increment est exactement la bonne approche.

Tant que vous appelez mysql_insert_id() directement après avoir appelé le mysql_query() pour insérer la ligne, vous n'avez pas à vous soucier d'obtenir le mauvais identifiant. PHP et MySQL s'occupent de tout ça pour vous.

-3

Si vous pouvez simplement verrouiller la table.

LOCK TABLE myTable FOR WRITE; 
SELECT MAX(id) FROM myTable; 
INSERT.... 
INSERT.... 
INSERT.... 
SELECT MAX(id) FROM myTable; 
UNLOCK TABLES; 

Cela empêchera quiconque de faire quoi que ce soit avec myTable, mais vous aurez alors le min/max gamme pour vos ids.

-daniel

+0

-1: a) mysql_insert_id est déjà thread-safe, comme indiqué par Gus et staticsan. b) Ce sera un porc de performance ou pas de raison. La question implique un accès multi-thread. c) Utiliser MAX (id) est une mauvaise idée. Bien qu'un ID auto-incrémenté soit souvent défini comme MAX (colonne) +1, par exemple dans MyISAM, vous ne devriez pas vous en servir pour des raisons de portabilité. d) La question implique que le résultat pour chaque insertion est nécessaire, pas seulement le dernier insert. – EboMike

+0

b) Les tables peuvent être verrouillées pendant de courtes périodes. c) Oui, MAX (id) est une mauvaise idée en ce qui concerne la portabilité, mais qui change les bases de données? C'est un événement rare. d) Le résultat est toutes les valeurs insérées depuis le début SELECT MAX (id) jusqu'à la fin SELECT MAX (id). – Daniel

+1

-1: sur soi-même. J'aurais dû lire la question plus attentivement. :) – Daniel

Questions connexes