0

このクエリでトランザクションを使用したい

DELETE FROM tbl WHERE id IN(?, ?, ?)

ただし、ID の数は可変です。時には2つ、時には5つなど。

?すべての ID を含む単一の引数を受け入れるように、別の方法で書き直すことはできますか?

コード:

$pdo->beginTransaction();
$st = $pdo->prepare('DELETE FROM tbl WHERE id IN(?, ?, ?)');

foreach( ... ){

  $st->execute(array($id1, $id2, $id3));
  // but here I may have only 2 IDs to pass, or 5 etc.
}

$pdo->commit();
4

3 に答える 3

1

の 10 のように、固定数のパラメーターを使用しますDELETE FROM tbl WHERE id IN (?,?,?,?,?, ?,?,?,?,?)。このクエリを準備し、10 個のパラメーターの部分を使用して繰り返し実行します。

for ($offset = 0; $offset < count($yourIdArray); $offset += 10) {
    $params = array_slice($yourIdArray, $offset, 10);
    if (count($params) < 10)
      $params = array_pad($params, 10, $params[0]);
    $st->execute(...);
}

パラメーターの最終セットは、配列に既に含まれている ID によって単純にパディングされます (副作用はありません)。

(注: 私は PHP を利用できませんし、PHP の専門家でもありません。したがって、上記を疑似コードと見なしてください。)

ステートメント/クエリでパラメーターをチャンクするアプローチが、クエリ/ステートメントキャッシュやクエリ/ステートメントの準備のコストが高いとは思わないSqlite/PHPで意味があるかどうかはわかりません。私は主に、クエリ/ステートメントに異なる数のパラメーターを持つことから生じる「クエリ/ステートメントキャッシュ汚染」を回避するために、Oracle データベースでこのアプローチを使用しました。

于 2013-10-16T05:33:28.453 に答える
1

お尋ねの「XY問題」といえば、

単一の を受け入れるように別の方法で書き直すことはできますか? すべての ID を含む引数?

いいえ。

また、それにはほとんど意味がありません。複数の実行は、どんな犠牲を払っても追求しなければならないものではありません。

しかし、あなたが直面している本当の問題について言えば、

明らかに解決策が 1 つまたは 2 つある可能性があります。ただし、すべての XY 質問者と同様に、最も重要な詳細を省略しているため、推測することしかできません。たとえば、すべての ID を保存してから、ループの後、コミットする前に一度にすべてを削除できます。

または、毎回削除を準備してください。大したことではありません。

于 2013-10-13T19:19:25.163 に答える