2010-09-23 24 views
40

Traté de truncar una tabla con claves externas y recibieron el mensaje:que ha obtenido un error "La instrucción DELETE en conflicto con la restricción REFERENCIA"

"No se puede truncar la tabla porque está siendo referenciada por una clave externa restricción ".

He leído mucha literatura sobre el problema y pensaron que he encontrado la solución mediante el uso de borrar

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

Pero todavía tiene un mensaje de error:

"la eliminación declaración en conflicto con la restricción de REFERENCIA ".

Cuando intento eliminar con Microsoft Management Studio y ejecute la consulta anterior

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

no da un error y funciona correctamente. Quiero eliminar toda la información de una tabla y agregar nueva en ella, pero no quiero soltar y crear claves externas.

Respuesta

6

Está intentando eliminar una fila a la que hace referencia otra fila (posiblemente en otra tabla).

Debe borrar esa fila primero (o al menos volver a establecer su clave externa a otra cosa), de lo contrario terminaría con una fila que hace referencia a una fila no existente. La base de datos lo prohíbe.

+0

Resolví mi problema con eliminar cada fila de la tabla "secundaria" y después de eliminar todas las filas de la tabla "principal". Pero todavía tengo algunas preguntas :) como "** Cuando intento eliminar con microsoft management studio y ejecutar la consulta anterior (p. Ej., DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)) no dio error, funcionó correctamente. ** " – Peter

40

El error significa que tiene datos en otras tablas que hacen referencia a los datos que está intentando eliminar.

Debería soltar y volver a crear las restricciones o eliminar los datos a los que hace referencia la clave externa.

Suponga que tiene las siguientes tablas

dbo.Students 
(
StudentId 
StudentName 
StudentTypeId 
) 


dbo.StudentTypes 
(
StudentTypeId 
StudentType 
) 

Supongamos que existe una restricción de clave externa entre la columna de StudentTypeId en StudentTypes y la columna de StudentTypeId en Students

Si intenta eliminar todos los datos de StudentTypes una Se producirá un error ya que la columna StudentTypeId en Students hace referencia a los datos en la tabla StudentTypes.

EDIT:

DELETE y TRUNCATE esencialmente lo mismo. La única diferencia es que TRUNCATE no guarda los cambios en el archivo de registro. Tampoco puede usar una cláusula WHERE con TRUNCATE

COMO por qué puede ejecutar esto en SSMS pero no a través de su Aplicación. Realmente no puedo ver que esto suceda. La restricción FK arrojaría un error independientemente de dónde se originó la transacción.

+0

Gracias, intentaré eliminar la tabla" secundaria "primero y luego la maestra. ¿Va a funcionar si uso TRUNCATE en lugar de DELETE? ¿Puede decirme por qué en MS Management Studio puedo eliminar las filas de la tabla con la misma consulta que me da error cuando lo intento con la aplicación – Peter

+0

@Peter? He actualizado mi respuesta – codingbadger

+4

Está lejos de ser la "única diferencia" , p.ej truncado no puede suceder si hay alguna referencia. Y truncar no puede suceder en una transacción en la mayoría de los sistemas. Y truncar no puede suceder como parte de un procedimiento almacenado. Y truncar debe estar en un lote separado en la mayoría de los sistemas. Y truncar no puede disparar disparadores. –

1

Para ELIMINAR, sin cambiar las referencias, primero debe eliminar o alterar (de manera adecuada para su propósito) todas las filas relevantes en otras tablas.

Para TRUNCATE debe eliminar las referencias. TRUNCATE es una sentencia DDL (comparable a CREATE y DROP) que no es una declaración DML (como INSERTAR y ELIMINAR) y no provoca disparos, ya sean explícitos o asociados con referencias y otras restricciones. Debido a esto, la base de datos podría ponerse en un estado incoherente si se permitiera TRUNCATE en tablas con referencias. Esta era una regla cuando TRUNCATE era una extensión del estándar utilizado por algunos sistemas, y es obligatorio según el estándar, ahora que se ha agregado.

9

¿Ha considerado aplicar ON DELETE CASCADE cuando corresponde?

Cuestiones relacionadas