LAST_INSERT_ID() MijnSQL

Ik heb een MySQL-vraag die volgens mij vrij eenvoudig moet zijn. Ik moet de LAST INSERTED ID van table1 retourneren wanneer ik de volgende MySql-query uitvoer:

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

Zoals u begrijpt, retourneert de huidige code alleen de LAST INSERT ID van table2 in plaats van table1, hoe kan ik de id van table1 krijgen, zelfs als ik tussen in table2 invoeg?


Antwoord 1, autoriteit 100%

Je zou de laatste invoeg-ID in een variabele kunnen opslaan:

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);    

Of haal de max id uit tabel1

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;   

Antwoord 2, autoriteit 8%

Aangezien je de vorige LAST_INSERT_ID() daadwerkelijk in de tweede tabel hebt opgeslagen, kun je deze daar vandaan halen:

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();

Antwoord 3, autoriteit 5%

Hierdoor kunt u een rij invoegen in 2 verschillende tabellen en wordt ook een verwijzing naar beide tabellen gemaakt.

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;

Antwoord 4

Ik had hetzelfde probleem in Bash en ik doe zoiets:

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

die prima werkt 🙂 maar

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);"

Werk niet. Want na de eerste opdracht wordt de shell uitgelogd bij MySQL en opnieuw ingelogd voor de tweede opdracht, en dan is de variabele @last_inert_id niet meer ingesteld.
Mijn oplossing is:

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});"

Misschien is iemand op zoek naar een oplossing, een bash: -)


Antwoord 5

We hebben slechts één persoon die records invoert, dus ik voer de volgende zoekopdracht onmiddellijk uit na het inzetstuk:

$result = $conn->query("SELECT * FROM corex ORDER BY id DESC LIMIT 1");
while ($row = $result->fetch_assoc()) {
            $id = $row['id'];
}

Hiermee wordt de laatste ID uit de database opgehaald.


Antwoord 6

Het zou mogelijk zijn om de last_id_in_table1-variabele op te slaan in een PHP-variabele om het later te gebruiken?

Met deze last_id moet ik wat records in een andere tabel met deze last_id bijvoegen, dus ik heb:

1) Doe een insert en ontvang de last_id_in_table1

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

2) Voor alle onbepaalde rijen in een andere tabel, waarbij u deze rijen bijwerkt met het last_id_insert gegenereerd in het inzetstuk.

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

Antwoord 7

In plaats van deze LAST_INSERT_ID()
Probeer deze te gebruiken

mysqli_insert_id(connection)

Antwoord 8

Voor no InnoDB-oplossing: u kunt een procedure gebruiken
don't forgot to set 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

en u kunt het gebruiken …

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

Antwoord 9

in trigger before_insert dit werkt voor mij:

SET @Last_Insrt_Id = (SELECT(AUTO_INCREMENT /*-1*/) /*as  Last_Insert_Id*/ 
FROM information_schema.tables 
WHERE table_name = 'tblTableName' AND table_schema = 'schSchemaName');

of in Simple Select:

SELECT(AUTO_INCREMENT /*-1*/) as Last_Insert_Id
FROM information_schema.tables 
WHERE table_name = 'tblTableName' AND table_schema = 'schSchemaName'); 

Als u wilt, verwijdert u de opmerking </*-1*/en test in andere gevallen.
Voor meerdere gebruik kan ik een functie schrijven. Het is gemakkelijk.


Antwoord 10

We kunnen ook $ Conn- & GT gebruiken; insert_id;
// Maak verbinding

   $conn = new mysqli($servername, $username, $password, $dbname);
    $sql = "INSERT INTO MyGuests (firstname, lastname, email)
    VALUES ('John', 'Doe', '[email protected]')";
    if ($conn->query($sql) === TRUE) {
        $last_id = $conn->insert_id;
        echo "New record created successfully. Last inserted ID is: " . $last_id;
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }

Antwoord 11

Voor laatste en ten tweede laatste:

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

Antwoord 12

Alleen om toe te voegen aan Rodrigo Post, in plaats van LAATSTE_INSERT_ID () in query kunt u Selecteer MAX (ID) van Tabel1 gebruiken;, maar u moet (),

gebruiken

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

Antwoord 13

Als u van mysql, na uw zoekopdracht, de laatste auto-incrementele id wilt hebben zonder een andere zoekopdracht, voer dan uw code in:

mysql_insert_id();

Other episodes