2010-09-23 35 views
40

J'ai essayé de tronquer une table avec les clés étrangères et ont reçu le message:j'ai eu erreur « L'instruction DELETE en conflit avec la contrainte REFERENCE »

"ne peut pas tronquer la table car il est référencé par une clé étrangère contrainte ".

Je lis beaucoup de littérature sur le problème et de la pensée que j'ai trouvé la solution à l'aide de supprimer

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

Mais j'ai toujours un message d'erreur:

"Le SUPPRIMER instruction en conflit avec la contrainte REFERENCE ".

Lorsque je tente de supprimer avec Microsoft Management Studio et exécuter la requête précédente

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

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

Répondre

6

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

Vous devez d'abord supprimer ligne (ou au moins redéfinir sa clé étrangère sur autre chose), sinon vous obtiendrez une ligne qui référence une ligne inexistante. La base de données interdit cela. L'erreur signifie que vous avez des données dans d'autres tables qui référence les données que vous essayez de supprimer.

+0

J'ai résolu mon problème avec la suppression de chaque ligne de la table "enfant" et après la suppression de toutes les lignes de la table "parent". Mais encore quelques questions :) comme "** Lorsque j'essaie de supprimer avec Microsoft Studio de gestion et exécuter la requête précédente (par exemple DELETE FROM nom_table DBCC CHECKIDENT (nom_table, RESEED, 0)) il n'a pas donné une erreur cela a fonctionné correctement. ** " – Peter

40

Vous devez supprimer ou 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 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 StudentTypes un erreur se produira que la colonne StudentTypeId dans Students référence les données dans le tableau 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. En outre, vous ne pouvez pas utiliser une clause WHERE avec TRUNCATE

AS 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 lancerait toujours une erreur indépendamment de l'origine de la transaction.

+0

Merci, je vais essayer de supprimer la table" enfant "d'abord et après le maître. Est-ce que ça va fonctionner si j'utilise TRUNCATE au lieu de DELETE. Pouvez-vous me dire pourquoi dans MS Management Studio je peux supprimer les lignes de la table avec la même requête qui me donne une erreur quand je l'essaie avec l'application – Peter

+0

@Peter - J'ai mis à jour ma réponse – codingbadger

+4

C'est loin de la "seule différence" , par exemple tronquer ne peut pas arriver s'il y a des références du tout. Et tronquer ne peut pas arriver dans une transaction sur la plupart des systèmes. Et tronquer ne peut pas se produire dans le cadre d'une procédure stockée. Et tronquer doit être dans un lot séparé dans la plupart des systèmes. Et tronqué ne peut pas déclencher des déclencheurs. –

1

Pour SUPPRIMER, sans modifier les références, vous devez d'abord supprimer ou modifier (de 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 déclenche pas de déclencheurs, qu'ils soient explicites ou associés à des références et autres contraintes. Pour cette raison, la base de données pourrait être mise dans un état incohérent si TRUNCATE était autorisé sur des tables avec des références. C'était une règle lorsque TRUNCATE était une extension de la norme utilisée par certains systèmes, et est imposée par la norme, maintenant qu'elle a été ajoutée.

9

Avez-vous envisagé d'appliquer ON DELETE CASCADE, le cas échéant?