web-dev-qa-db-fra.com

J'ai eu une erreur "L'instruction DELETE était en conflit avec la contrainte REFERENCE"

J'ai essayé de tronquer une table avec des clés étrangères et j'ai reçu le message suivant:

"Impossible de tronquer la table car elle est référencée par une contrainte FOREIGN KEY".

J'ai lu beaucoup de littérature sur le problème et je pensais avoir trouvé la solution en utilisant delete

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)

Mais j'ai toujours un message d'erreur:

"L'instruction DELETE était en conflit avec la contrainte REFERENCE".

Lorsque j'essaie de supprimer avec Microsoft Management Studio et d'exécuter la requête précédente

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)

cela ne donne pas d'erreur et fonctionne correctement. Je souhaite supprimer toutes les informations d'une table et en ajouter de nouvelles, mais je ne souhaite pas supprimer et créer de clés étrangères.

47
Peter

L'erreur signifie que vous avez des données dans d'autres tables qui référencent les données que vous essayez de supprimer.

Vous devrez soit supprimer et recréer les contraintes, soit supprimer les données référencées par la clé étrangère.

Supposons que vous ayez les tables suivantes

dbo.Students
(
StudentId
StudentName
StudentTypeId
)


dbo.StudentTypes
(
StudentTypeId
StudentType
)

Supposons qu’une contrainte de clé étrangère existe entre la colonne StudentTypeId dans StudentTypes et la colonne StudentTypeId dans Students

Si vous essayez de supprimer toutes les données de StudentTypes, une erreur se produira lorsque la colonne StudentTypeId de Students fera référence aux données de la table StudentTypes.

EDIT:

DELETE et TRUNCATE font essentiellement la même chose. La seule différence est que TRUNCATE n'enregistre pas les modifications dans le fichier journal. Aussi, vous ne pouvez pas utiliser une clause WHERE avec TRUNCATE

POURQUOI vous pouvez l’exécuter dans SSMS mais pas via votre application. Je ne peux vraiment pas voir cela se produire. La contrainte FK génère toujours une erreur, quelle que soit l'origine de la transaction.

46
codingbadger

Avez-vous envisagé de postuler ON DELETE CASCADE le cas échéant?

12
annakata

Vous essayez de supprimer une ligne référencée par une autre ligne (éventuellement dans une autre table).

Vous devez supprimer that rangée en premier (ou au moins redéfinir sa clé étrangère sur quelque chose d’autre), sinon vous obtiendrez une rangée faisant référence à une rangée non existante. La base de données interdit cela.

7
Konrad Rudolph

Pour SUPPRIMER, sans modifier les références, vous devez d'abord supprimer ou modifier (de manière appropriée) toutes les lignes pertinentes dans d'autres tables.

Pour TRUNCATE, vous devez supprimer les références. TRUNCATE est une instruction DDL (comparable à CREATE et DROP) et non pas une instruction DML (comme INSERT et DELETE) et ne provoque pas l'activation de déclencheurs, qu'ils soient explicites ou associés à des références et à d'autres contraintes. De ce fait, la base de données pourrait passer à un état incohérent si TRUNCATE était autorisé sur des tables avec des références. Telle était la règle lorsque TRUNCATE était une extension du standard utilisé par certains systèmes, et est mandaté par le standard, à présent qu’il a été ajouté.

1
Jon Hanna