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