unicas una tipos restricción restricciones restriccion puede ora modificar existente eliminar ejemplos ejemplo constraint como columna claves check borrar sql-server sql-server-2008

sql-server - una - restricciones check sql server ejemplos



Eliminar una fila de SQL ignorando todas las claves y restricciones externas (8)

En todas las tablas con claves externas que apuntan a esta, use:

ALTER TABLE MyOtherTable NOCHECK CONSTRAINT fk_name

Tengo una fila en una mesa. Esta fila tiene una columna de ID referenciada en algunas otras tablas con millones de filas. La instrucción SQL para eliminar la fila siempre se agota. Desde mi diseño, sé que nunca se hace referencia a la fila que deseo eliminar en ningún otro lugar. Por lo tanto, me gustaría que SQL ignore tener que revisar todas las demás tablas para una referencia de clave externa a esta fila y eliminar la fila inmediatamente. ¿Hay una manera rápida de hacer esto en SQL 2008? Quizás algo en la línea de:

DELETE FROM myTable where myTable.ID = 6850 IGNORE CONSTRAINTS

O algo por el estilo.


No deshabilite las restricciones bajo ninguna circunstancia. Esta es una práctica extremadamente estúpida. No puedes mantener la integridad de los datos si haces cosas como estas. La integridad de los datos es la primera consideración de una base de datos, ya que sin ella no tiene nada.

El método correcto es eliminar de las tablas secundarias antes de intentar eliminar el registro principal. Probablemente esté agotando el tiempo porque ha configurado deltes en cascada, lo que es otra mala práctica en una gran base de datos.


Puede configurar las restricciones en esa tabla / columna para que no se verifiquen temporalmente y luego volver a habilitar las restricciones. La forma general sería:

ALTER TABLE TableName NOCHECK CONSTRAINT ConstraintName

Luego vuelva a habilitar todas las restricciones con

ALTER TABLE TableName CHECK CONSTRAINT ConstraintName

Supongo que esto sería temporal aunque? Obviamente no querrías hacer esto consistentemente.


Quería eliminar todos los registros de ambas tablas porque eran todos los datos de prueba. Utilicé la GUI de SSMS para deshabilitar temporalmente una restricción FK, luego ejecuté una consulta DELETE en ambas tablas y, finalmente, volví a habilitar la restricción FK.

Para deshabilitar la restricción FK:

  1. ampliar el objeto de base de datos [1]
  2. expandir el objeto de tabla dependiente [2]
  3. expandir la carpeta ''Claves''
  4. clic derecho sobre la clave externa
  5. Elija la opción ''Modificar''
  6. cambie la opción ''Aplicar restricción de clave externa'' a ''No''
  7. cerrar la ventana ''Relaciones de clave externa''
  8. cerrar la pestaña diseñador de mesa
  9. cuando se le solicite, confirme guardar cambios
  10. ejecutar consultas de borrado necesarias
  11. volver a habilitar la restricción de clave externa de la misma manera que acaba de desactivarla.

[1] en el panel ''Explorador de objetos'', se puede acceder a través de la opción de menú ''Ver'', o la tecla F8

[2] si no está seguro de qué tabla es la dependiente, puede verificarla haciendo clic con el botón derecho en la tabla en cuestión y seleccionando la opción ''Ver dependencias''.


Sé que este es un hilo antiguo, pero aterricé aquí cuando las eliminaciones de mi fila fueron bloqueadas por restricciones de clave externa. En mi caso, el diseño de mi tabla permitió valores "NULL" en la columna restringida. En las filas que se eliminarán, cambié el valor de la columna restringida a "NULL" (que no viola la restricción de clave foránea) y luego eliminé todas las filas.


Si, simplemente corre

DELETE FROM myTable where myTable.ID = 6850

Y DEMUESTRE EL MOTOR VERIFICAR LAS RESTRICCIONES .

Si está intentando ser "inteligente" y deshabilitar las restricciones, tendrá que pagar un precio enorme: habilitar de nuevo las restricciones tiene que verificar cada fila en lugar de la que acaba de eliminar. Existen indicadores internos que SQL mantiene para saber que una restricción es ''confiable'' o no. La "optimización" daría como resultado el cambio de estos indicadores a "falso" (lo que significa que SQL ya no confía en las restricciones) o tiene que volver a verificarlos desde cero.

Consulte las Pautas para deshabilitar índices y restricciones y restricciones y rendimiento que no son de confianza .

A menos que hiciera algunas mediciones sólidas que demostraran que la verificación de restricciones de la operación DELETE es un cuello de botella en el rendimiento, deje que el motor haga su trabajo.



SET FOREIGN_KEY_CHECKS = 0;

/ * Ejecuta tu script * /

SET FOREIGN_KEY_CHECKS = 1;

Ver si esto ayuda, Esto es para ignorar las comprobaciones de foreign key . Pero eliminar esta desactivación es una muy mala práctica.