0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SQLServer】複数テーブルにまたがる情報を削除する

Last updated at Posted at 2024-07-09

先にSQL文から

BEGIN TRANSACTION;

BEGIN TRY
-- 子テーブルのデータを先に削除
DELETE ChildTable FROM 
    ChildTable
JOIN 
    ParentTable 
ON 
    ChildTable.ForeignKey = ParentTable.PrimaryKey
WHERE
    [条件];
    
-- 親テーブルのデータを削除
DELETE FROM 
    ParentTable
WHERE 
    [条件];
    
-- トランザクションのコミット
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- ロールバック処理
ROLLBACK TRANSACTION;
END CATCH;

詳細説明

BEGIN TRANSACTION;

トランザクションの開始位置を示します.

BEGIN TRY
END TRY
BEGIN CATCH
END CATCH

エラー処理のブロックです.
TRYブロック内でエラーが発生するとCATCHブロックへ制御が渡ります.

-- 子テーブルのデータを先に削除
DELETE ChildTable FROM 
    ChildTable
JOIN 
    ParentTable 
ON 
    ChildTable.ForeignKey = ParentTable.PrimaryKey
WHERE
    [条件];
    

テーブルに親子の依存関係がある場合,子テーブルから削除します.
依存関係の仕様上親テーブルを先に削除すると子テーブルが削除できなくなります.

-- 親テーブルのデータを削除
DELETE FROM 
    ParentTable
WHERE 
    [条件];

親テーブルを消す

COMMIT TRANSACTION;

トランザクションの途中で行われたすべての変更は一時的に保持されています.
COMMIT TRANSACTION; を実行することでデータベースに変更内容が確定されます.

-- ロールバック処理
ROLLBACK TRANSACTION;

トランザクションの途中で問題が発生したため,ロールバック処理をします.
今回の場合は
BEGIN TRANSACTION; の直前までロールバックされます.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?