複数のSQLを一連の操作(1つの塊)として扱いたい場合、トランザクションを用いるのが良いかと思います。
- トランザクション開始
- SQL実行
- SQL実行
- コミット(またはロールバック)
トランザクション開始以降のSQL実行は、「4. コミット」されることで実際に結果が確定されます。
(「ロールバック」するとなかったことにされる)
コメントを受けての追記 4/23
質問の意図を読み違えて、混乱させてしまったかもしれません。
挙動としては、削除が完全に終わってから挿入する事を想定しています。
今現在、これを実行すると正しく動作しているように思えるのですが、レコード量が膨大になるとまた違うものなのでしょうか?
この点については、SQLは順番に実行されるのでDELETE文実行完了後、INSERT文が実行されることになります。
ただし、システム開発においてはエラー時の処理も考慮し、SELECT文以外のSQL実行時にはトランザクションを利用することが多いかと思います。そのため、トランザクションの利用を検討されることをおすすめします。
また、;
の利用以外でのSQLの複数実行は以下のように実装できます。
(変数名(sql1,sql2)があまりよろしくないですが、実装イメージとしてご確認ください)
例として、DELETE文とINSERT文が一塊りとなるよう、トランザクションを使っています。
php
1
2// トランザクション開始
3$pdo->beginTransaction();
4
5try {
6
7 // DELETE実行
8 $sql1 = "DELETE FROM datatable WHERE hoge <= 2"
9 $stmt = $pdo->query($sql1);
10
11 // INSERT実行
12 $sql2 = "INSERT INTO datatable(id,hoge) VALUES(1,3)"
13 $stmt = $pdo->query($sql2);
14
15 // DELETE文とINSERT文が正常に実行できた場合は
16 // コミット
17 $pdo->commit();
18
19} catch (PDOException $e) {
20 // SQL実行時にエラーが発生した場合は
21 // ロールバック
22 $pdo->rollback();
23
24 // エラー処理を記述(ログ出力とか、throw e;とか)
25}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/22 17:54
2018/04/25 16:11
2018/04/25 16:35