メインとしているマスタテーブルからDELETEを行った際に、
関連する他の複数のテーブルからも同時に共通のレコードの削除を行いたい時ってたまにあると思います。
そんな時にテーブル毎にSQLを実行せずとも一発でも掛けます。
実行環境
サーバの種類: MySQL
サーバのバージョン: 5.6.20
共通IDサンプルテーブル
UserId | Name |
1 | 山田 |
2 | 田中 |
3 | 佐藤 |
AutoId | Type | UserId | Date |
1 | 出勤 | 1 | 2020/1/8 9:16:10 |
2 | 出勤 | 2 | 2020/1/8 10:20:11 |
3 | 早退 | 1 | 2020/1/8 15:16:06 |
4 | 退勤 | 2 | 2020/1/8 18:00:56 |
5 | 出勤 | 3 | 2020/1/9 9:00:51 |
左: M_UserData … 社員IDと名前を持つ
右: T_TimeCard … 社員の出退勤のレコードを持つ
こんな感じのテーブルが有ったとして、この度山田さんが退職したとします。
テーブル個数分のDELETE
通常通りテーブル毎に消していく場合は、
1 2 |
DELETE FROM M_UserData WHERE UserId = 1; DELETE FROM T_TimeCard WHERE UserId = 1; |
当然これだけでOK。でも、もう少し複雑なテーブルだったりするとSQL作成して実行して~が結構面倒だし冗長になりがち。
一度のSQLでDELETE
そんな時はこうする↓
1 2 3 4 5 6 7 8 9 10 11 |
DELETE User ,Time FROM M_UserData As User LEFT JOIN T_TimeCard AS Time ON User.UserId = Time.UserId WHERE User.UserId = 1 |
すると両方のテーブルから山田さんレコードは抹消されます。
一つ注意としてDELETE~FROMの間のテーブル指定はテーブル名のM_UserDataやT_TimeCardとしてしまうと、
“Unknown table ‘M_UserData’ in MULTI DELETE”
とエラーが吐かれちゃう。
必ずエイリアスで記述しないとダメなのでお気を付けください(ᵔᴥᵔ)
コメント