10

2匹のペットをテーブルに挿入し、それらのlastInsertId()を取得して、一度に1匹ずつさらに処理することができます(2つのクエリ)。
1つのクエリに2つの行を挿入する場合、2つのlastInsertIds()を取得し、それらを変数に割り当てる方法があるかどうか疑問に思っています。

$query = "INSERT INTO pets (pet_name) VALUES (':coco'),(':jojo')";
$pet_insert = $dbh->prepare($query);
$pet_insert->execute(array(':coco' => $coco,':jojo' => $jojo));
$New_PetID = $dbh->lastInsertId();

cocoとjojoのlastInsertId()を取得することは可能ですか?だから次のようなもの:

$New_PetID1 = $dbh->lastInsertId();//coco
$New_PetID2 = $dbh->lastInsertId();//jojo

これは同じIDを与えますが、2つのIDを取得する方法はありますか?参考までに、これはtryブロックにあります。

4

9 に答える 9

16

不可能です。両方の行に対して生成されたIDが必要な場合は、2つの分離されたIDを実行する必要がありますINSERT

重要単一のINSERTステートメントを使用して複数の行を挿入する場合、LAST_INSERT_ID()は、最初に挿入された行に対してのみ生成された値を返します。これは、他のサーバーに対して同じINSERTステートメントを簡単に再現できるようにするためです。

http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id

于 2012-09-25T00:31:08.903 に答える
9

最後の挿入IDに1を追加して、実際の最後のレコードIDを実現できます。2つを超えるレコードを挿入する場合は、last_insert_idにrowCount-1を追加するだけです。

innodb_autoinc_lock_modeを0(「従来型」)または1(「連続」)に設定すると、テーブルレベルのAUTO-INCロックが最後まで保持されるため、任意のステートメントによって生成される自動インクリメント値はギャップなしで連続します。ステートメントであり、一度に実行できるそのようなステートメントは1つだけです。

生成されたIDは、接続ごとにサーバーに保持されます。これは、関数によって特定のクライアントに返される値が、そのクライアントによってAUTO_INCREMENT列に影響を与える最新のステートメントに対して生成された最初のAUTO_INCREMENT値であることを意味します。この値は、他のクライアントが独自のAUTO_INCREMENT値を生成した場合でも、他のクライアントの影響を受けることはありません。この動作により、各クライアントは、他のクライアントのアクティビティを気にすることなく、またロックやトランザクションを必要とせずに、独自のIDを取得できます。

詳細については、このドキュメントをお読みくださいhttp://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html

于 2015-06-26T03:35:05.910 に答える
3

ブルースが提供する種類の解決策は避けてください。自動増分値は、1とは異なる値に設定できます。たとえば、マスター間レプリケーションの場合です。少し前に、アプリケーションの1つが実行されているホストがデータベースの設定を変更しました。たまたま、偶然にも、IDが1つではなく2つ増えていることに気づきました。このようなコードがあれば、深刻な問題が発生する可能性があります。

于 2014-04-17T11:33:55.517 に答える
2

ドキュメントには次のように記載されています。Returns the ID of the last inserted row or sequence value

挿入された各行のIDを取得するには、2つのクエリを実行する必要があります。

于 2012-09-25T00:32:15.957 に答える
1

ええと、1000回の挿入は1回の挿入より少し長いので、トピックの問題はまだ興味深いものです。考えられる回避策は、2つのクエリを実行することです。1つ目は1000行を挿入する方法で、2つ目は、挿入された行に一意の行がある場合にそれらを選択する方法です。たとえばペットの場合:

INSERT INTO pets ( name ) VALUES ( 'coco', 'jojo' );
SELECT id FROM pets WHERE name IN ( 'coco', 'jojo' );

これは、ビッグデータセットにのみメリットをもたらす可能性があります。

于 2013-12-04T10:32:03.833 に答える
1

私は自分でそれを試し、それが可能であると考えるまで、それは不可能であると仮定しようとしまし

各実行後に、lastInsertId()を追加し、キーを割り当てます。

私の例では:

// First query
$sql = "INSERT INTO users
(username, email)
values
(:username, :email)";
$sth = $this->db->prepare($sql);
$sth->bindParam(':username', $data['username'], PDO::PARAM_STR);
$sth->bindParam(':email', $data['email'], PDO::PARAM_STR);

// Second Query
$sql2 = "INSERT INTO users
(username, email)
values
(:username, :email)";
$sth2 = $this->db->prepare($sql2);
$sth2->bindParam(':username', $data['username'], PDO::PARAM_STR);
$sth2->bindParam(':email', $data['email'], PDO::PARAM_STR);

// Start trans
$this->db->beginTransaction();

// Execute the two queries
$sth->execute();
$last['ux1'] = $this->db->lastInsertId(); // <---- FIRST KEY

$sth2->execute();
$last['ux2'] = $this->db->lastInsertId(); // <---- SECOND KEY

// Commit
$this->db->commit();

そして、最後に挿入された2つのIDを取得できました

配列([作成] =>配列([ux1] => 117 [ux2] => 118)

)。

これが正しい答えを探している他の人に役立つことを願っています。

于 2014-05-30T00:01:25.830 に答える
0

最初のステートメントと2番目のaddで配列を使用しましたif condition。したがって、挿入レコードが最後のIDを取得する場合は、2番目のステートメントを作成します。2番目の配列を挿入して最後のIDを取得する場合は、2番目のステートメントを繰り返します

    for ($count=0; $count < count($_POST["laptop_ram_capacity"]); $count++) { 
        $stmt = $con->prepare('INSERT INTO `ram` 
                (ram_capacity_id, ram_type_id, ram_bus_id, ram_brand_id, ram_module_id)
                VALUES (?,?,?,?,?)');

            //excute query//
            $stmt->execute(array(
                            $_POST['laptop_ram_capacity'][$count],
                            $_POST["laptop_ram_type"][$count],
                            $_POST["laptop_ram_bus"][$count],
                            $_POST["laptop_ram_brand"][$count],
                            $_POST["laptop_ram_module"][$count]
                            ));
            //fetsh the data//
            $rows = $stmt->rowCount();
            // i add the below statment in if condition to repeat the insert and pass the repeated of the last statement//
            if ($rows > 0) {
            $LASTRAM_ID = $con->lastInsertId();

            $stmt = $con->prepare('INSERT INTO `ram_devicedesc_rel` 
                (ram_id, Parent_device_description_id)
                VALUES (?,?)');

            //excute query//
            $stmt->execute(array(
                            $LASTRAM_ID,
                            $LASTdevicedesc_ID
                            ));
            //fetsh the data//
            } else {
                echo "Error: " . $sql . "<br>" . $conn->error;
            }                                    
        }
于 2018-10-22T07:58:33.010 に答える
-1

'multi_query()'を使用して、すべてのクエリを次のような1つの変数に追加できます。'$ sql1 = "first insert";' '$ sql2="2番目の挿入";' '$ sql3="3番目の挿入";' など...作成するインサートの数を数えます。ここで、「multi_query()」を使用してすべての「$sql」クエリを実行します。最後の挿入IDを取得します。今、あなたがしなければならないのは'$ rowno = $lastinsertid-$countofinserts'です。だから基本的にあなたは番号を取得します。これに1を追加すると、結果の数値からlastinsertidまでが、実行した挿入クエリの挿入IDになります。

于 2015-06-05T14:05:19.273 に答える
-2

可能です!必要なのは、PDO lastInsertId()メソッドを呼び出すことだけです。これにより、複数または一括INSERTを実行するときに、最初に挿入されたIDが返されます。次に、最後のINSERTステートメントの影響を受ける行数を使用して単純な加算減算操作を実行する必要があります。

$firstInsertedId = $this->lastInsertId();
$InsertedIds = range($firstInsertedId, ($firstInsertedId + ($stmt->rowCount() - 1)) );
print_r($InsertedIds);
于 2013-03-15T19:49:43.090 に答える