Frage

ich eine MySQL-Frage haben, dass ich denke, muss ganz einfach sein. Ich brauche die letzte eingefügte ID von table1 zurückzukehren, wenn ich die folgende MySql-Abfrage ausführen:

INSERT INTO table1 (title,userid) VALUES ('test',1); 
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(),4,1);
SELECT LAST_INSERT_ID();

Wie Sie den aktuellen Code verstehen können, wird gerade die letzte INSERT ID table2 zurückkehren statt tabelle1, wie kann ich die ID von table1 erhalten, auch wenn ich in table2 zwischen einfügen?

War es hilfreich?

Lösung

Sie können speichern Sie die letzte Einsatz-ID in einer Variablen:

INSERT INTO table1 (title,userid) VALUES ('test', 1); 
SET @last_id_in_table1 = LAST_INSERT_ID();
INSERT INTO table2 (parentid,otherid,userid) VALUES (@last_id_in_table1, 4, 1);    

erhalten oder den max id frm tabelle1

INSERT INTO table1 (title,userid) VALUES ('test', 1); 
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(), 4, 1); 
SELECT MAX(id) FROM table1;   

Andere Tipps

Da Sie die vorherigen LAST_INSERT_ID tatsächlich gespeichert () in die zweite Tabelle, können Sie es von dort bekommen:

INSERT INTO table1 (title,userid) VALUES ('test',1); 
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(),4,1);
SELECT parentid FROM table2 WHERE id = LAST_INSERT_ID();

Damit können Sie eine Zeile in zwei verschiedene Tabellen einfügen und erstellt einen Verweis auf beiden Tabellen zu.

START TRANSACTION;
INSERT INTO accounttable(account_username) 
    VALUES('AnAccountName');
INSERT INTO profiletable(profile_account_id) 
    VALUES ((SELECT account_id FROM accounttable WHERE account_username='AnAccountName'));
    SET @profile_id = LAST_INSERT_ID(); 
UPDATE accounttable SET `account_profile_id` = @profile_id;
COMMIT;

Ich hatte das gleiche Problem in bash und ich tue etwas wie folgt aus:

mysql -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');"

, der gut arbeitet :-) Aber

mysql -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');set @last_insert_id = LAST_INSERT_ID();"
mysql -D "dbname" -e "insert into table2 (id_tab1) values (@last_insert_id);"

funktioniert nicht. Da nach dem ersten Befehl, wird die Schale aus mysql abgemeldet und angemeldet wieder für den zweiten Befehl ein, und dann wird die Variable @last_insert_id nicht mehr eingestellt. Meine Lösung ist:

lastinsertid=$(mysql -B -N -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');select LAST_INSERT_ID();")
mysql -D "dbname" -e "insert into table2 (id_tab1) values (${lastinsertid});"

Vielleicht jemand Suche nach einer Lösung eine bash: -)

Es wäre möglich, das last_id_in_table1 Variable in eine PHP-Variablen zu speichern und später zu verwenden?

Mit diesem last_id Ich brauche einige Datensätze in einer anderen Tabelle mit diesem last_id zu befestigen, so brauche ich:

1) Führen Sie eine INSERT und erhalten die last_id_in_table1

INSERT into Table1(name) values ("AAA"); 
SET @last_id_in_table1 = LAST_INSERT_ID();

2) Für alle indeterminated Zeilen in einer anderen Tabelle, AKTUALISIERUNG diese Zeilen mit dem last_id_insert im Einsatz erzeugt.

$element = array(some ids)    
foreach ($element as $e){ 
         UPDATE Table2 SET column1 = @last_id_in_table1 WHERE id = $e 
    }

Für keine InnoDB-Lösung: Sie eine Prozedur verwenden können don't forgot to set the the delimiter for storing the procedure with ;

CREATE PROCEDURE myproc(OUT id INT, IN otherid INT, IN title VARCHAR(255))
BEGIN
LOCK TABLES `table1` WRITE;
INSERT INTO `table1` ( `title` ) VALUES ( @title ); 
SET @id = LAST_INSERT_ID();
UNLOCK TABLES;
INSERT INTO `table2` ( `parentid`, `otherid`, `userid` ) VALUES (@id, @otherid, 1); 
END

Und Sie können es verwenden ...

SET @myid;
CALL myproc( @myid, 1, "my title" );
SELECT @myid;

Für letzte und vorletzte:

INSERT INTO `t_parent_user`(`u_id`, `p_id`) VALUES ((SELECT MAX(u_id-1) FROM user) ,(SELECT MAX(u_id) FROM user  ) );

Nur für Rodrigo Beitrag hinzuzufügen, statt LAST_INSERT_ID () in Abfrage Sie SELECT MAX verwenden können (id) FROM table1 ;, aber Sie müssen () verwenden,

INSERT INTO table1 (title,userid) VALUES ('test', 1)
INSERT INTO table2 (parentid,otherid,userid) VALUES ( (SELECT MAX(id) FROM table1), 4, 1)

Wir haben nur eine Person Datensätze eingeben, so dass ich nach dem Einsatz der folgenden Abfrage sofort ausgeführt werden:

$result = $conn->query("SELECT * FROM corex ORDER BY id DESC LIMIT 1");

while ($row = $result->fetch_assoc()) {

            $id = $row['id'];

}

Diese ruft die letzte ID aus der Datenbank.

Wenn Sie von MySQL haben, nach Ihrer Anfrage, die letzte Auto-Inkremental-ID ohne eine weitere Abfrage, setzen Sie in Ihrem Code:

mysql_insert_id();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top