2010-05-28 4 views
2

Je suis nouveau sur php. Donc, s'il vous plaît pardonnez-moi si cela semble être une question stupide.Comment obtenir tous les identifiants de la ligne créée par une instruction d'insertion de plusieurs lignes

Dites que j'ai une instruction d'insertion MySQL insert into table (a,b) values (1,2),(3,4),(5,6). La table 'table' a un champ d'incrémentation automatique appelé 'id'.

Comment puis-je récupérer tous les identifiants créés par l'instruction d'insertion ci-dessus?

Ce sera génial si je reçois un exemple qui utilise mysqli.

+0

Si vous connaissez le nombre d'insertions, vous pouvez peut-être faire quelque chose avec la requête de sommation MAX (id)? – Nitrodist

+0

Pourquoi avez-vous besoin de tous ces identifiants? Quelles sont les données que vous insérez? –

+0

@Nitrodist oh non! Ecrivez-le des milliers de fois: ** id n'est pas un nombre! ** –

Répondre

1

Vous ne pouvez pas. Je vous suggère de conserver vos propres identifiants (en utilisant guid ou votre propre table d'incrémentation automatique) et de l'utiliser lorsque vous insérez dans la table.

Mais il est possible d'obtenir la valeur auto-incrément pour le dernier inséré à l'aide LAST_INSERT_ID():

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

+0

Je ne fais pas confiance à last_insert_id() car il pourrait y avoir une autre requête qui insèrerait des lignes dans une autre table. S'il vous plait corrigez moi si je me trompe. –

+0

@Curious Jo http://php.net/last_insert_id peut vous corriger. –

0

comme suivre jusqu'à AngeDeLaMort: Vous pouvez séparer vos inserts et faire quelque chose comme cela:

$data = array (
    array(1,2), 
    array(3,4), 
    array(5,6) 
); 
$ids = array(); 

foreach ($data as $item) { 
    $sql = 'insert into table (a,b) values ('.$item[0].','.$item[1].')'; 
    mysql_query ($sql); 
    $id[] = mysql_insert_id(); 
} 

Maintenant tous vos nouveaux identifiants sont dans le tableau $ id.

+0

Je pensais à cela aussi. Mais n'est-ce pas efficace? je veux dire frapper la base de données plusieurs fois? –

1

La réponse d'AngeDeLaMort est presque exacte. Certainement, la façon la plus appropriée de traiter le problème est d'insérer une ligne à la fois et d'interroger l'insert_id ou de générer la séquence ailleurs (ce qui présente des avantages supplémentaires en termes d'évolutivité).

Je vous déconseille vivement de tenter de déterminer le dernier insert_id et de comparer ce dernier insert_id après l'insertion - il y a juste aussi des façons cela échouera.

Mais ... une approche alternative serait:

.... 
"INSERT INTO destn (id, data, other, trans_ref) 
SELECT id, data, other, connection_id() FROM source"; 
.... 
"SELECT id FROM destn WHERE trans_ref=connection_id()"; 
.... 
"UPDATE destn SET trans_ref=NULL where trans_ref=connection_id()"; 

La deuxième requête renverra les ids générés (notez que cela suppose que vous utilisez la même connexion pour les 3 requêtes). La troisième requête est nécessaire car les identifiants de connexion doivent retourner dans le pool lorsque vous vous déconnectez (c'est-à-dire qu'ils sont réutilisés).

C.

0

Peut-être que je peux faire

$insert = "insert into table (a,b) values (1,2),(3,4),(5,6)"; 
$mysqli->query($insert); 
$rows_to_be_inserted=3; 
$inserted_id = $mysqli->insert_id // gives me the id of the first row in my list 
$last_row_id = ($inserted_id+$rows_to_be_inserted)-1; 
$mysql->query("select * from table where id between $inserted_id and $last_row_id"); 

ce que vous les gars dire?

1

Dans certains cas, si vous avez un autre identifiant de type tel qu'un ID utilisateur, vous pouvez filtrer votre requête par ID unique supérieur ou égal à mysql_insert_id(), limiter par le nombre de lignes affectées et afficher uniquement celles par l'utilisateur . Cela ne fonctionnerait vraiment que dans une transaction.

$SQL = "INSERT INTO Table 
     (UserID, Data) 
     VALUES 
     (1,'Foo'), 
     (1,'Bar'), 
     (1,'FooBar')"; 

$Result = mysql_query($SQL); 
$LastID = mysql_insert_id(); 
$RowsAffected = mysql_affected_rows(); 

$IDSQL = "SELECT RecordID 
      FROM Table 
      WHERE UserID = 1 
      AND RecordID >= '$LastID' 
      LIMIT '$RowsAffected'"; 
$IDResult = mysql_query($IDSQL); 
Questions connexes