質問

Companies という名前のテーブルがあり、DepartmentID 列があるとします。EmployeeID 列を持つ Departaments テーブルもあります。もちろん、Employee テーブルもあります。問題は、会社を削除したいので、まずすべての部門のすべての従業員を削除し、次に会社のすべての部門を削除する必要があることです。カスケード削除はオプションではないため、ネストされたトランザクションを使用したいと考えています。SQLは初めてなので、助けていただければ幸いです。

役に立ちましたか?

解決

なぜここでネストされたトランザクションが必要なのかわかりません。実際に必要なトランザクションは 1 つだけです。

BEGIN TRAN

DELETE FROM Employee
    FROM Employee
    INNER JOIN Department ON Employee.DepartmentID = Department.DepartmentID
    INNER JOIN Company ON Department.CompanyID = Company.CompanyID
    WHERE Company.CompanyID = @CompanyID

DELETE FROM Department
    FROM Department
    INNER JOIN Company ON Department.CompanyID = Company.CompanyID
    WHERE Company.CompanyID = @CompanyID

DELETE FROM Company
    WHERE Company.CompanyID = @CompanyID

COMMIT TRAN

二重の FROM に注意してください。これはタイプミスではなく、DELETE で JOIN を実行するための正しい SQL 構文です。

各ステートメントはアトミックであり、DELETE 全体が成功するか失敗しますが、バッチ全体が成功するか失敗するため、この場合はそれほど重要ではありません。

ところで、あなたは人間関係を逆向きにしていたと思います。部門は EmployeeID を持たず、Employee はDepartmentID を持ちます。

他のヒント

あなたの質問には答えていませんが、外部キーについて 当然のことですが、なぜそれが選択肢にないのでしょうか?

ネストされたトランザクションについては、次のとおりです。

BEGIN
  delete from Employee where departmentId = 1;
  BEGIN
     delete from Department where companyId = 2;
     BEGIN
        delete from Company where companyId = 2;
     END
  END
END

もちろんプログラム的には異なって見えますが、それは使用しているプラ​​ットフォームによって異なります

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top