J’ai eu l’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:

Msgstr “” ” 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 j’ai pensé que j’avais 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) 

il ne donne pas d’erreur et fonctionne correctement. Je veux supprimer toutes les informations d’une table et y append de nouvelles, mais je ne veux pas supprimer et créer des clés étrangères.

L’erreur signifie que vous avez des données dans d’autres tables qui font référence aux données que vous essayez de supprimer.

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

Supposons que vous ayez les tableaux suivants

 dbo.Students ( StudentId StudentName StudentTypeId ) dbo.StudentTypes ( StudentTypeId StudentType ) 

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

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

MODIFIER:

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

Pour savoir 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.

Avez-vous envisagé d’appliquer ON DELETE CASCADE cas échéant?

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

Vous devez d’abord supprimer cette ligne (ou au moins redéfinir sa clé étrangère sur autre chose), sinon vous vous retrouveriez avec une ligne faisant référence à une ligne non existante. La firebase database interdit cela.

Pour supprimer, sans modifier les références, vous devez d’abord supprimer ou modifier d’une autre manière (d’une manière adaptée à vos besoins) toutes les lignes pertinentes des autres tables.

Pour TRUNCATE, vous devez supprimer les références. TRUNCATE est une instruction DDL (comparable à CREATE et DROP) et non une instruction DML (comme INSERT et DELETE) et ne provoque pas le déclenchement de déclencheurs, qu’ils soient explicites ou associés à des références et à d’autres contraintes. De ce fait, la firebase database pourrait être mise dans un état incohérent si TRUNCATE était autorisé sur des tables contenant des références. Ceci était une règle lorsque TRUNCATE était une extension du standard utilisé par certains systèmes, et que le standard le requirejs, maintenant qu’il a été ajouté.