Okarin note

頭の整理もかねて色々と書いていきます

TypeORMでレコードを消す際に使うdelete()とclear()の違い(MySQL)

TypeORMのエンティティマネージャーに定義されている削除用のメソッドは二つあるので名称も違うし違いがあるだろうということで調べました。
それと業務で使っていて、実際にDBからレコードを消す際にどちらを使うか迷ったのも調べた理由の一つです。

clear()

TRUNCATE TABLEを実行してレコードを消す。
MySQL8.0ではTRUNCATE TABLEはDMLではなくDDLに変わったようで暗黙的にコミットが走る。
そのため、トランザクションを張ったときに上手く機能してくれない可能性がある。
https://stackoverflow.com/questions/5972364/mysql-truncate-table-within-transaction/5972738#5972738

delete()

DELETE FROMを実行してレコードを消す。
DMLなのでトランザクション中、エラーが発生したらロールバックしてくれる。

まとめ

暗黙的にコミットされる可能性のあるclear()よりもdelete()を使った方が使い勝手がよさそうだなと思います。
テストデータを用意するようなコミットされても問題ない処理ならclear()を使ってもよさそうです。