2

2つのクエリが相互に依存しています。つまり、最初のクエリが実行されない場合は2番目のクエリを実行しないでください。逆に、2番目のクエリを実行できない場合は、最初のクエリを実行しないでください。

INSERT INTO `table` VALUES (1,2,3)
UPDATE `otherTable` SET `val1`=1 WHERE `id`=$idOfInsert

ON DUPLICATE KEY UPDATE答えではありません。

使ってみmysqli::multi_queryましたが、2回目は実行できなくても1回目は実行されます(エラーで停止します)。

PHPでこれを実現するにはどうすればよいですか?

4

4 に答える 4

4

使用するエンジンがトランザクションをサポートしている場合 (InnoDB、BDB)、トランザクションを使用できます。

例については、 http://dev.mysql.com/doc/refman/5.0/en/commit.htmlを参照してください。

編集: mysqliを使用した簡単な例:

$connection->autocommit(FALSE); // disable auto-commit and start a new transaction
$result  = $connection->query("INSERT INTO `table` VALUES (1,2,3)");
$result &= $connection->query("UPDATE `otherTable` SET `val1`=1 WHERE `id`=$idOfInsert");
if (!$result) {
  // One of the queries has failed: cancel the transaction
  $connection->rollback();
} else {
  // Both queries worked:commit the current transaction
  $connection->commit();
}
$connection->autocommit(TRUE); // enable auto-commit

クエリを最適化することができます (つまり、最初のクエリが失敗した場合は 2 番目のクエリを実行しない、準備済みステートメントを使用する、など)。

于 2013-01-05T20:09:16.013 に答える
-1

[INSERT IGNORE] を使用して、SQL サーバーにエラーを無視させます。

INSERT IGNORE INTO `table` VALUES (1,2,3);

次に、LAST_INSERT_ID() を使用して挿入された ID を取得するか、何も挿入されていない場合は 0 を取得します。ID = 0 のレコードがないため、UPDATE は失敗します。

UPDATE `otherTable` SET `val1`=1 WHERE `id`=LAST_INSERT_ID();
于 2013-01-05T20:17:14.920 に答える
-3

複数のクエリ呼び出しに分割します。

$result = mysql_query("INSERT ...");
if ($result) {
    mysql_query("UPDATE ...");
}

しかし、「2 番目にできない場合は、最初に行う必要はありません」は不可能です。PHP は時間をさかのぼることができず、2 番目のクエリが失敗したことを最初のクエリに警告します。

于 2013-01-05T20:03:17.200 に答える