c# - framework - Recibí el error "La instrucción DELETE entró en conflicto con la restricción REFERENCE"
delete en entity framework (4)
Intenté truncar una tabla con claves externas y recibí el mensaje:
" No se puede truncar la tabla porque está referenciada por una restricción FOREIGN KEY ".
Leí mucha literatura sobre el problema y pensé que encontré la solución al usar eliminar
DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)
Pero todavía tengo un mensaje de error:
" La instrucción DELETE entró en conflicto con la restricción de REFERENCIA ".
Cuando intento eliminar con Microsoft Management Studio y ejecutar 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 agregarle algo nuevo, pero no quiero soltar y crear claves externas.
¿Ha considerado solicitar ON DELETE CASCADE
donde sea relevante?
El error significa que tiene datos en otras tablas que hacen referencia a los datos que intenta eliminar.
Necesitará eliminar y volver a crear las restricciones o eliminar los datos a los que hace referencia la clave externa.
Supongamos 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 StudentTypes
en StudentTypes
y la columna StudentTypeId
en Students
Si intenta eliminar todos los datos en StudentTypes
se producirá un error cuando la columna StudentTypeId
en Students
haga referencia a los datos en la tabla StudentTypes
.
EDITAR:
DELETE
y TRUNCATE
esencialmente hacer lo mismo. La única diferencia es que TRUNCATE
no guarda los cambios en el archivo de registro. Tampoco puedes usar una cláusula WHERE
con TRUNCATE
En cuanto a 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 aún generaría un error independientemente de dónde se originó la transacción.
Está intentando eliminar una fila a la que hace referencia otra fila (posiblemente en otra tabla).
Primero debes eliminar esa fila (o al menos restablecer su clave externa a otra cosa), de lo contrario terminarías con una fila que hace referencia a una fila que no existe. La base de datos lo prohíbe.
Para BORRAR, sin cambiar las referencias, primero debe eliminar o modificar (de una manera adecuada para sus propósitos) todas las filas relevantes en otras tablas.
Para TRUNCATE debes eliminar las referencias. TRUNCATE es una declaración DDL (comparable a CREATE y DROP), no una declaración DML (como INSERT y DELETE) y no causa que se activen los activadores, ya sea 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 de la norma utilizada por algunos sistemas, y es obligatorio por la norma, ahora que se ha agregado.