2013-04-10 5 views
5

Gibt es eine effiziente Möglichkeit zum Abrufen aller zuletzt eingefügten Zeilen automatisch inkrementierten IDs von MySQL-Datenbank mit PHP? Angenommen, ich weiß nicht, wie viele Zeilen in einen Stapel eingefügt werden sollen, aber ich brauche alle ihre IDs nach dem Einfügen.Wie alle zuletzt eingefügten Zeilen IDs in mysql-php abgerufen werden?

Nach dem Googeln habe ich keinen effizienten Weg gefunden, dies zu tun, also bin ich mir nicht sicher, ob das möglich ist. Ich kann diesem folgen, muss aber mehrmals auf die Datenbank zugreifen, um IDs abzurufen.

$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); 
    $ids[] = mysql_insert_id(); 
} 

Danke

+0

so ist Ihre ID automatisch inkrement –

+1

was ist falsch daran? sollte gut funktionieren. – slash197

+3

vor Ihrer Charge erhalten die maximale ID. Nach Ihrer Charge erhalten Sie die maximale ID. jetzt kennst du die Bandbreite. – ITroubs

Antwort

1

Ihr Code ist fast vollständige Lösung.

$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) or mysql_error(); 
    $ids[] = mysql_insert_id(); 
} 

var_dump($ids); 

Wenn die Frage nach Performance-Problem ist, dann könnte eine andere Lösung

sein
foreach ($data as $item) { 
    $sql = "INSERT INTO `table`.`table` (`a`, `b`) VALUES ('{$item[0]}' ,'{$item[1]}');"; 
    mysql_query ($sql) or mysql_error(); 
} 

$last_id = mysql_insert_id(); 
$total = count($data); 
for($i = 0; $i <= $total; $i++){ 
    $ids[] = $total-$i; 
} 

Diese multiple SQL-Abfrage verhindern.

+0

Sie zeigen auf $ IDs Variable. Aber auch wenn Ihre $ ID nach Leevi Code gedruckt wird, sollte es alle IDs enthalten. –

+0

@silentboy: nichts falsches eigentlich wie du sagst, aber ich bin nur neugierig, dass das effizient sein wird ... – leevi

+0

@SureshKamrushi schauen OP-Code. was '$ ids = array()' dort tun. Er legte '$ ids' alle in' $ id'-Array. das ist der Fehler –

0

Wenn Ihr auto_incremented Feld „normal“ ist, so dass es nicht in besonderer Weise verhalten, sondern erhöht die letzte id durch einen können Sie den Maximalwert davon vor dem Einsetzen finden und dann finden Sie alle Datensätze, die höher sind.

Beispiel:

$sql = "SELECT id FROM table ORDER BY id DESC LIMIT 1"; 
    // get maximal value before insert 

$sql = "SELECT id FROM table WHERE id > :last_id"; // get all new 

Aber diese Lösung ist nicht viel professioneller.

+2

Wird ungenau sein, wenn etwas anderes eine Anfrage stellt, die in die db eingefügt wird - was der Fall wäre, wenn dieselbe Seite/Anfrage von zwei Benutzern geladen wurde - wenn das kein Faktor ist, könnte es funktionieren. Führen Sie in diesem Fall jedoch nicht einfach die erste Abfrage aus - zweimal. 'range ($ firstMax, $ lastMax)' - würde alle IDs geben. Und wird funktionieren, auch wenn die Reichweite sehr groß ist. – AD7six

+1

Ich würde die erste Abfrage nach dem ersten Einfügen ausführen. Wenn Sie das vor dem ersten Einfügen tun, stoßen Sie auf große Probleme, wenn jemand einige der letzten Zeilen und das Autoinkrement gelöscht hat! = max (id) !! – ITroubs

+0

@ AD7six Ja, Sie haben Recht. Ich habe nicht über die Möglichkeit nachgedacht, Zeilen aus einer anderen Quelle einzufügen. – Voitcus

1

Mysql gibt nur die letzte eingefügte ID zurück, leider gibt es keine Möglichkeit, alle von ihnen (direkt) abzurufen. Sie müssen Workarounds verwenden, zum Beispiel:

  1. die eingefügten Zeilen berechnen, und die letzte Eingabe-ID und den Rest nach hinten berechnen.

  2. Generieren Sie benutzerdefinierte IDs, anstatt mysql sie inkrementell erstellen zu lassen, und wenn die Abfrage erfolgreich ist, speichern Sie die IDs in einem Array (normalerweise würde bei einem Fehler die gesamte Abfrage trotzdem fehlschlagen).

Die zweite Methode wird empfohlen, da mit n1, wenn Sie slighly komplexe Operationen tun, zum Beispiel INSERT blah blah ON DUPLICATE KEY die modifiziert mit als 2 Einsätzen zählen würde (fragen Sie mich nicht warum) statt einem, und Sie müssen einige Berechnungen durchführen, um zu sehen, wie viele tatsächlich eingefügt und wie viele geändert wurden.

By the way, stoppen mysql_ Erweiterung verwenden, ist es veraltet ist, verwenden Sie mysqli oder gU statt

+0

Danke für Ihre Antwort. Ich denke eigentlich an eine effiziente Lösung in Sachen Autoinkrement. FYI: Ich bin mir der mysql_ Erweiterungen bewusst und verwende mysqli_ bereits in meinem eigentlichen Code. Danke :) – leevi

+0

Eine Idee wäre, den Einfügungen eine Datetime oder einen Timestamp hinzuzufügen, die Datetime der letzten eingefügten ID zu erhalten und alle IDs mit dieser Datetime abzufragen. – aleation

-1

gibt es die ID des letzten Einsatzes id

<?php 

$conn = mysql_connect('localhost', 'user', 'password'); 

mysql_select_db('test'); 

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

$ids = array(); 

foreach ($data as $item) { 

    $sql = 'insert into testtable (a,b) values ('.$item[0].','.$item[1].')'; 
    mysql_query ($sql, $conn); 
    $id[] = mysql_insert_id($conn); 
} 
+1

-1 Das sieht aus wie eine Kopie des Codes in der Frage - mit einem Tippfehler – AD7six

+0

@ AD7six: Ich habe den gleichen Code verwendet, aber mysql_insert_id ($ conn) anstelle von mysql_insert_id ändern. Da ich neu bei stackoverflow bin, dachte ich, wäre es schön, das komplette Beispiel zu teilen. Wenn Sie wissen, wie Sie dieses Beispiel weitergeben können, lassen Sie es mich wissen. –

+0

* [Wenn der Link-Bezeichner nicht angegeben ist, wird der letzte von mysql_connect() geöffnete Link angenommen] (http://php.net/manual/en/function.mysql-insert-id.php) * - dh Hinzufügen von ' $ conn 'zu dem Code ändert nicht, wie es funktioniert. Die Änderung von '$ ids 'zu' $ id' bedeutet nur, dass eine neue Variable alle IDs anstelle der ID enthält, die das OP erwartet. – AD7six

0

Wenn ich Chargen von Aufzeichnungen müssen verfolgen eingegeben , Ich habe ein zusätzliches Feld in der Tabelle, normalerweise als Stempel oder etwas bezeichnet. Wenn die Datensätze eingefügt werden, wird das Stempelfeld mit dem aktuellen Zeitstempel gefüllt, der von der Funktion time() angegeben wird. Dann kann jede Charge nachverfolgt werden, egal wie alt sie ist. Auch das Speichern des Zeitstempels ist eine einfache Möglichkeit, die genaue Zeit zu erhalten, als sie hinzugefügt wurden.

Verwandte Themen