1

明示的な値と選択されたコンテンツの両方を挿入するクエリがあります。基本的なインクリメントも行っています。

INSERT INTO `table` (`myID`, `myVal1`, `myVal2`) SELECT `myID` + 1, 'explValHere', 'otherValThere')
FROM `table` ORDER BY `myID` DESC LIMIT 0,1

テーブルには複数のIDがあり、特定の列内でインクリメントするため、これを行っています。したがって、最初に言うように、自動インクリメントとinsert_idを使用することはできません。

もちろん問題は、インサートが選択を返さないことですが、それはできますか?この挿入クエリを実行して結果を返す方法はありますか?

4

3 に答える 3

2

クエリにはが含まれているためLIMIT 1、「結果」をセッション/ユーザー定義変数に格納できます。まだ2つのクエリですが、再入可能です。各接続は独自のセッションです。

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
setup($pdo);

$query = "
    INSERT INTO tbl1 (myID, myVal1, myVal2)
    SELECT @foo:=myID+1, 'val1', 'val2' FROM tbl2 WHERE x=0 LIMIT 1
";
$pdo->exec($query);
foreach( $pdo->query('SELECT @foo as foo') as $row ) {
    echo $row['foo'];
}


function setup($pdo) {
    $pdo->exec('CREATE TEMPORARY TABLE tbl1 (myID int, myVal1 varchar(16), myVal2 varchar(16))');
    $pdo->exec('CREATE TEMPORARY TABLE tbl2 (myID int, x int)');
    $pdo->exec('INSERT INTO tbl2 (myID, x) VALUES (1,1),(2,1),(3,0),(4,0),(5,1)');
}

x = 0のtbl2の「最初の」レコードは(myID = 3、x = 0)であり、スクリプトはを出力し4ます。

それとストアドプロシージャなどを除いて、(私の知る限り)SQLServerのOUTPUTやpostgresqlのMySQLのRETURNING句のようなものはありません。

于 2012-10-25T11:36:42.190 に答える
0

(トランザクションで)最初に値を読み取り、その後に挿入ステートメントを実行できます。

于 2012-10-25T11:04:15.270 に答える
0

通常の挿入後にこのようにしてみてください

INSERT INTO `table` (`myID`, `myVal1`, `myVal2`) values ('xxx','xxxx','xxxx');

次に、を使用してqueryget lastinseridを実行します

$id=mysql_insert_id();

次に、挿入された行を次のように更新します

mysql_query("update table set myid=$id where id=$id");
于 2012-10-25T11:09:34.010 に答える