168

MySQLの質問がありますが、これは非常に簡単なはずです。次のMySqlクエリを実行するときに、table1から最後に挿入されたIDを返す必要があります。

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

現在のコードはtable1ではなくtable2のLASTINSERTIDを返すだけであることが理解できるので、table2に挿入した場合でもtable1からIDを取得するにはどうすればよいですか?

4

14 に答える 14

281

最後の挿入IDを変数に格納できます:

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

または、table1から最大IDを取得します(編集:警告。最大IDを使用する場合の競合状態からのエラーの可能性については、Rob Starlingからのコメントの注を参照してください)

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;  

(警告:Rob Starlingがコメントで指摘しているように)

于 2010-10-01T09:39:27.647 に答える
23

前のLAST_INSERT_ID()を実際に2番目のテーブルに格納したので、そこから取得できます。

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();
于 2013-06-07T08:43:05.800 に答える
14

これにより、2つの異なるテーブルに行を挿入し、両方のテーブルへの参照も作成できます。

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;
于 2013-04-01T13:29:42.543 に答える
6

私はbashでも同じ問題を抱えていて、次のようなことをしています。

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

これはうまくいきます:-)しかし

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

動作しません。最初のコマンドの後、シェルはmysqlからログアウトされ、2番目のコマンドのために再度ログインされるため、変数@last_insert_idは設定されなくなります。私の解決策は次のとおりです。

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

多分誰かがbashの解決策を探しています:-)

于 2017-05-15T10:41:51.923 に答える
1

レコードを入力するのは1人だけなので、挿入の直後に次のクエリを実行します。

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

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

            $id = $row['id'];

}

これにより、データベースから最後のIDが取得されます。

于 2017-02-08T17:59:48.737 に答える
1

last_id_in_table1変数をphp変数に保存して、後で使用することは可能でしょうか?

このlast_idを使用して、このlast_idを使用して別のテーブルにいくつかのレコードを添付する必要があるため、次のものが必要です。

1)INSERTを実行して、last_id_in_table1を取得します

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

2)別のテーブルの不確定な行については、挿入で生成されたlast_id_insertを使用してこれらの行を更新します。

$element = array(some ids)    
foreach ($element as $e){ 
         UPDATE Table2 SET column1 = @last_id_in_table1 WHERE id = $e 
    }
于 2017-04-27T13:39:37.807 に答える
1

InnoDBソリューションがない場合:手順を使用できます 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

そして、あなたはそれを使うことができます...

SET @myid;
CALL myproc( @myid, 1, "my title" );
SELECT @myid;
于 2018-07-24T19:53:01.190 に答える
1

これの代わりにこれLAST_INSERT_ID() を使用してみてください

mysqli_insert_id(connection)
于 2020-05-02T02:41:51.453 に答える
1

トリガーBEFORE_INSERTで、これは私のために機能します:

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

または、単純に選択します。

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

必要に応じて、コメント/*-1*/を削除し、他の場合にテストします。複数回使用するために、関数を書くことができます。それは簡単です。

于 2021-03-09T13:00:04.483 に答える
0

$conn->insert_id;を使用することもできます。//接続を作成します

    $conn = new mysqli($servername, $username, $password, $dbname);
    $sql = "INSERT INTO MyGuests (firstname, lastname, email)
    VALUES ('John', 'Doe', 'john@example.com')";

    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;
    }
于 2021-08-07T05:49:19.853 に答える
-1

最後と最後から2番目の場合:

INSERT INTO `t_parent_user`(`u_id`, `p_id`) VALUES ((SELECT MAX(u_id-1) FROM user) ,(SELECT MAX(u_id) FROM user  ) );
于 2014-03-04T12:44:00.040 に答える
-1

私のコードは私のために機能しません。私の最後の挿入のIDを回復するためのアイデアはこれが私のコードです私は新しく開発していてあまり知りません

クエリでエラーが発生し、$ session-> msg('s'、"製品が正常に追加されました。コスト設定を行う"。LAST_INSERT_ID());の行に印刷を送信する方法がわかりません。

すでに確認しており、データベースの接続とフィールドが正しいことを確認してください。

<?php
 if(isset($_POST['add_producto'])){
  $req_fields = array( 'nombre', 'categoria', 'proveedor');
   validate_fields($req_fields);
   if(empty($errors)){
     $codigobarras  = remove_junk($db->escape($_POST['codigobarras']));
     $identificador   = remove_junk($db->escape($_POST['identificador']));
     $nombre   = remove_junk($db->escape($_POST['nombre']));
     $categoria   =  (int)$db->escape($_POST['categoria']);
     $etiquetas   =  remove_junk($db->escape($_POST['etiquetas']));
     $unidadmedida   =  remove_junk($db->escape($_POST['unidadmedida']));
     $proveedor   =  remove_junk($db->escape($_POST['proveedor']));
     $fabricante   =  remove_junk($db->escape($_POST['idfabricante']));
     $maximo   =  remove_junk($db->escape($_POST['maximo']));
     $minimo   =  remove_junk($db->escape($_POST['minimo']));
     $descripcion   =  remove_junk($db->escape($_POST['descripcion']));
     $dias_vencimiento   =  remove_junk($db->escape($_POST['dias_vencimiento']));
      
     $servicio   = "0";
      if (isset($_POST['servicio'])){
        $servicio =implode($_POST['servicio']);
     }
     $numeroserie   = "0"; 
      if (isset($_POST['numeroserie'])){
        $numeroserie =implode($_POST['numeroserie']);
     }

     $ingrediente   =  "0";
      if (isset($_POST['ingrediente'])){
        $ingrediente =implode($_POST['ingrediente']);
     }

     $date    = make_date();
     $query  = "INSERT INTO productos (";
     $query .=" codigo_barras,identificador_producto,nombre,idcategoria,idetiquetas,unidad_medida,idproveedor,idfabricante,max_productos,min_productos,descripcion,dias_vencimiento,servicio,numero_serie,ingrediente,activo";
     $query .=") VALUES (";
     $query .=" '{$codigobarras}', '{$identificador}', '{$nombre}', '{$categoria}', '{$etiquetas}', '{$unidadmedida}', '{$proveedor}', '{$fabricante}', '{$maximo}', '{$minimo}', '{$descripcion}', '{$dias_vencimiento}', '{$servicio}', '{$numeroserie}', '{$ingrediente}', '1'";
     $query .=");";
     $query .="SELECT LAST_INSERT_ID();";

     if($db->query($query)){
      $session->msg('s',"Producto agregado exitosamente. Realizar configuracion de costos" . LAST_INSERT_ID());
       redirect('precio_producto.php', false);
     } else {
       $session->msg('d',' Lo siento, registro falló.');
       redirect('informacion_producto.php', false);
     }
   } else{
     $session->msg("d", $errors);
     redirect('informacion_producto.php',false);
   }
 }
?>
于 2021-09-16T19:33:31.720 に答える
-2

クエリでLAST_INSERT_ID()の代わりにRodrigo postに追加するには、SELECT MAX(id)FROM table1;を使用できますが、()、

INSERT INTO table1 (title,userid) VALUES ('test', 1)
INSERT INTO table2 (parentid,otherid,userid) VALUES ( (SELECT MAX(id) FROM table1), 4, 1)
于 2014-10-15T22:15:00.950 に答える
-9

mysqlから取得する必要がある場合は、クエリの後に、別のクエリを含まない最後の自動増分IDをコードに入力します。

mysql_insert_id();
于 2013-06-05T20:08:24.547 に答える