Suppression de lignes associées dans une relation plusieurs-à-plusieurs

Je supprime une ligne dans une table qui se trouve sur un site d'une relation plusieurs-à-plusieurs. Je voudrais également supprimer toutes les lignes connexes de l'autre côté de cette relation.

Par exemple, disons que j'ai les arrays suivants et que je veux supprimer une ligne de Cars . Je voudrais également supprimer toutes les lignes connexes des Drivers et, bien sûr, toutes les lignes qui ne sont plus nécessaires dans CarDrivers .

 Table Cars: CarID int CarName nvarchar(100) Table Drivers: DriverID int DriverName nvarchar(100) Table CarDrivers: CarID int Driver int 

Je sais comment joindre les tables ci-dessus dans une requête SELECT . Mais je ne vois pas comment supprimer des données à travers la relation.

Remarque: Les deux côtés de la relation implémentent des suppressions en cascade. Ainsi, par exemple, supprimer une ligne de Cars supprimera toutes les lignes associées dans CarDrivers . Mais évidemment, cela ne se propage pas à la table Drivers .

Je pense que la meilleure approche serait que vous deviez d'abord supprimer datatables de la table concernée. En d'autres termes, si vous vouliez supprimer une voiture et les pilotes correspondants qui utilisent cette voiture, vous devez d'abord supprimer les pilotes, puis la voiture. La table de jointure supprimera les loggings corrects à cause de ON CASCADE DELETE .

Essaye ça:

 delete from Drivers where DriverID in ( select d.DriverID from Drivers d inner join CarDrivers cd on d.DriverID = cd.Driver inner join Cars c on c.CarID = cd.CarID where c.CarID = 1 ) delete from Cars where CarID = 1 

Naturellement, vous n'avez pas besoin de coder en dur le 1 là, vous pouvez utiliser n'importe quel paramètre incluant un paramètre si vous utilisez cet extrait de code dans un proc stocké.

Votre requête n'a pas de sens

Les pilotes en tant qu'entités existent séparément de Cars. Les voitures peuvent être conduites par de nombreux conducteurs, les conducteurs peuvent conduire de nombreuses voitures. C'est pourquoi vous avez la table many-many.

Notez le bit "drivers can drive many cars". Cela signifie que si vous supprimez la ligne Pilotes, vous devez supprimer d'autres lignes dans CarDrivers.

Si vous voulez toujours faire cela, vous avez besoin d'un triggersur sur CarDrivers. Le CASCADE de Drivers à CarDrivers supprimera d'autres lignes CarDrivers pour vous. Je ne me souviens pas du comportement par défaut de la récursivité des triggersurs.

Quel bordel.

Note: cela a du sens si vous avez un caractère unique sur l'une des colonnes de la table many-many alors il devrait s'agir d'une key étrangère entre Cars et Drivers (Unique on Car signifie "au plus un pilote par voiture" signifie colonne NULLable FK Des voitures)

Mettez les suppressions en cascade sur la table CarDrivers.

Si vous avez access à la database et avez l'autorisation de modifier les tables, je créerais simplement des foreign keys et spécifierais onupdate et oncascade comme suit:

 ALTER TABLE [dbo].[Drivers] WITH CHECK ADD CONSTRAINT [FK__Cars] FOREIGN KEY([CarID]) REFERENCES [dbo].[Car] ([CarID]) ON UPDATE CASCADE ON DELETE CASCADE ALTER TABLE [dbo].[CarDrivers] WITH CHECK ADD CONSTRAINT [FK_Drivers_Cars] FOREIGN KEY([CarID]) REFERENCES [dbo].[Car] ([CarID]) ON UPDATE CASCADE ON DELETE CASCADE 

L'avantage de cette approche est que vous n'avez pas besoin de vous soucier des loggings orphelins. Au moment où vous supprimez un logging de la table Car, tous les éléments liés dans les autres tables sont automatiquement supprimés et mis à jour. Vos instructions SQL sont également plus courtes.

Il n'y a pas de relation entre la table Drivers et la table Cars. Cette relation est via la table CarDrivers. Ainsi, le problème existe toujours.

La seule façon que je connaisse pour automatiser la suppression de CASCADE est de supprimer le FK entre CarDrivers et la table des pilotes et d'append un triggersur de suppression avant ou après à CarDrivers pour supprimer l'input dans les pilotes où driver_id est celui de la ligne supprimée dans CarDrivers.

Ce n'est pas propre à bien des égards. Si la suppression est réellement requirejse dans la table de jointure, la relation est probablement incorrecte et une relation plus propre aurait été d'avoir modélisé la relation simplement comme «il y a beaucoup de conducteurs d'une voiture» ou un FK de Cars dans la table Drivers. . Comme indiqué ci-dessus, pour la relation entre les voitures et les conducteurs, une relation plusieurs-à-plusieurs est réellement correcte et vous ne supprimerez jamais un conducteur simplement parce que la voiture a été totalisée / supprimée.