Dois-je spécifier ON DELETE NO ACTION sur ma clé étrangère?
J'ai le DDL suivant que je suis à l'aide de SQL Server 2012:
CREATE TABLE Subject (
[SubjectId] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (50) Not NULL,
CONSTRAINT [PK_Subject] PRIMARY KEY CLUSTERED ([SubjectId] ASC)
)
CREATE TABLE Topic (
[TopicId] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (50) NOT NULL,
[SubjectId] INT NOT NULL,
CONSTRAINT [PK_Topic] PRIMARY KEY CLUSTERED ([TopicId] ASC)
)
ALTER TABLE [Topic] WITH CHECK ADD CONSTRAINT [FK_TopicSubject]
FOREIGN KEY([SubjectId]) REFERENCES [Subject] ([SubjectId])
ON DELETE NO ACTION
Ce que je veux, c'est pour le Serveur SQL server pour arrêter de me les la suppression d'un parent si une référence pour le parent existe chez l'enfant? Par exemple je veux un supprimer sur subjectID=3 dans le Sujet à l'échec si il y a des enfants avec SubjectId est de 3.
Pour cela, je ne sais pas et n'arrive pas à trouver la réponse. Ai-je besoin d'ajouter "DELETE NO ACTION" ou puis-je pas supprimer ces trois mots.
Je vous pose cette question comme une question similaire, j'ai eu une réponse que je dois définir un déclencheur sur le parent. Cependant, je pensais juste à la définition de la clé étrangère serait de m'en empêcher la suppression de la mère si l'enfant existe.
source d'informationauteur Melina
Vous devez vous connecter pour publier un commentaire.
De la column_constraint page sur MSDN:
Ainsi, vous pouvez éluder
ON DELETE NO ACTION
si vous le souhaitez et il va travailler tout de même.PAS à l'ACTION, rien ne se produit lorsque vous supprimez de votre Sujet le tableau de la Rubrique de la table. Dans ce cas, si il ya une ligne de Sujet pour un SubjectId vous ne pouvez pas supprimer, sans rompre l'intégrité référentielle, de sorte que la Suppression sera annulée.
Plus de MSDN:
Je vais vous suggérer que, bien que vous pouvez sauter la clause on delete no action, il pourrait ne pas être dans votre meilleur intérêt de le faire. Avoir cette spécifié dans la définition de la table peut empêcher quelqu'un, plus tard, de l'ajout d'une cascade supprimer parce qu'ils ont vu que vous avez l'intention pour que ne se produise pas. Cela est particulièrement vrai lorsque vous avez correctement script tous les objets de base de données et de les mettre dans le contrôle de code source et le code examinateur serait de voir qu'il y a une différence et de se demander pourquoi c'est arrivé. Trop souvent , les gens sont trop désireux d'ajouter sur delete cascade et de suppression des données qui devraient être maintenus (comme les dossiers financiers pour un client qui n'est plus valide). Ils le font parce qu'ils obtiennent de l'erreur qui ne leur laisse pas le supprimer et vous voulez juste pour se débarrasser de lui, au lieu de réaliser que c'est de les enregistrer à partir d'une énorme erreur. Au moins si vous avez le code pour Supprimer Aucune Action dans votre script de table, futurs responsables verrez que c'était intentionnel et pas seulement que vous avez oublié de mettre en place des suppressions en cascade. Bien sûr, si votre dba ne permet pas les suppressions en cascade (comme beaucoup le font pas et pour une bonne raison!) alors ce n'est pas un problème potentiel, mais en précisant votre intention est souvent une bonne chose pour la maintenabilité.
Vous pouvez supprimer les mots-clés (c'est la valeur par défaut)
Serait préférable de préciser ces actions
Voici plus d'infos: http://msdn.microsoft.com/en-us/library/aa933119%28v=sql.80%29.aspx
Vous aurez à écrire un déclencheur pour s'assurer ligne enfant ne sont pas supprimés, comme je ne pense pas que SQL Server a cette option de
ON DELETE RESTRICT