Question

Supposons que j'ai une table appelée Entreprises qui comporte une colonne DepartmentID.Il existe également une table Departments qui a comme colonne EmployeeID.Bien sûr, j'ai aussi une table Employee.Le problème est que je souhaite supprimer une entreprise, je dois donc d'abord supprimer tous les employés de chaque département, puis tous les départements de l'entreprise.Cascade Supprimer n'est pas une option, je souhaite donc utiliser des transactions imbriquées.Je suis nouveau sur SQL, j'apprécierais donc votre aide.

Était-ce utile?

La solution

Je ne sais pas pourquoi vous avez besoin de transactions imbriquées ici.Vous n’avez besoin que d’une seule transaction réelle :

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

Notez le double FROM, ce n'est pas une faute de frappe, c'est la syntaxe SQL correcte pour effectuer un JOIN dans un DELETE.

Chaque instruction est atomique, soit l'intégralité du DELETE réussira, soit échouera, ce qui n'est pas si important dans ce cas car l'ensemble du lot réussira ou échouera.

BTW- Je pense que vous aviez vos relations à l’envers.Le département n'aurait pas d'ID d'employé, l'employé aurait un ID de département.

Autres conseils

Je ne réponds pas à ta question, mais aux Clés étrangères est la voie à suivre, pourquoi n'est-ce pas une option ?

Quant aux transactions imbriquées, ce sont :

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

D'un point de vue programmatique, cela semble différent bien sûr, mais cela dépend de la plate-forme que vous utilisez

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top