teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コメントを受けての追記 4/23

2018/04/23 00:59

投稿

takyafumin
takyafumin

スコア2335

answer CHANGED
@@ -9,4 +9,46 @@
9
9
  (「ロールバック」するとなかったことにされる)
10
10
 
11
11
  * [トランザクションおよび自動コミット](http://php.net/manual/ja/pdo.transactions.php)
12
- * [PHP + PDO + MySQL のトランザクション制御方法まとめ](https://www.websec-room.com/2015/11/17/2356)
12
+ * [PHP + PDO + MySQL のトランザクション制御方法まとめ](https://www.websec-room.com/2015/11/17/2356)
13
+
14
+ ## コメントを受けての追記 4/23
15
+
16
+ 質問の意図を読み違えて、混乱させてしまったかもしれません。
17
+
18
+ > 挙動としては、削除が完全に終わってから挿入する事を想定しています。
19
+ > 今現在、これを実行すると正しく動作しているように思えるのですが、レコード量が膨大になるとまた違うものなのでしょうか?
20
+
21
+ この点については、SQLは順番に実行されるのでDELETE文実行完了後、INSERT文が実行されることになります。
22
+ ただし、システム開発においてはエラー時の処理も考慮し、SELECT文以外のSQL実行時にはトランザクションを利用することが多いかと思います。そのため、トランザクションの利用を検討されることをおすすめします。
23
+
24
+ また、`;`の利用以外でのSQLの複数実行は以下のように実装できます。
25
+ (変数名(sql1,sql2)があまりよろしくないですが、実装イメージとしてご確認ください)
26
+ 例として、DELETE文とINSERT文が一塊りとなるよう、トランザクションを使っています。
27
+
28
+ ```php
29
+
30
+ // トランザクション開始
31
+ $pdo->beginTransaction();
32
+
33
+ try {
34
+
35
+ // DELETE実行
36
+ $sql1 = "DELETE FROM datatable WHERE hoge <= 2"
37
+ $stmt = $pdo->query($sql1);
38
+
39
+ // INSERT実行
40
+ $sql2 = "INSERT INTO datatable(id,hoge) VALUES(1,3)"
41
+ $stmt = $pdo->query($sql2);
42
+
43
+ // DELETE文とINSERT文が正常に実行できた場合は
44
+ // コミット
45
+ $pdo->commit();
46
+
47
+ } catch (PDOException $e) {
48
+ // SQL実行時にエラーが発生した場合は
49
+ // ロールバック
50
+ $pdo->rollback();
51
+
52
+ // エラー処理を記述(ログ出力とか、throw e;とか)
53
+ }
54
+ ```