0

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

4

2 に答える 2

4

ここでネストされたトランザクションが必要な理由がわかりません。実際のトランザクションは 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 全体が成功するか失敗するかのどちらかですが、この場合はバッチ全体が成功するか失敗するかのいずれかになるため、これはそれほど重要ではありません。

ところで、あなたの関係は逆だったと思います。Department には EmployeeID がなく、Employee には DepartmentID があります。

于 2008-09-12T13:36:48.750 に答える
0

私はあなたの質問に答えていませんが、外部キー行くべき道です.なぜそれがオプションではないのですか?

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

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

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

于 2008-09-12T13:25:09.637 に答える