2009-12-07 16 views
25

Tengo una fila en una tabla. Esta fila tiene una columna de ID a la que se hace referencia en algunas otras tablas con millones de filas. La instrucción SQL para eliminar la fila siempre expira. Desde mi diseño, sé que nunca se hace referencia a la fila que deseo eliminar en ningún otro lado. Por lo tanto, me gustaría que SQL ignore tener que comprobar 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? Tal vez algo en la línea de:Eliminar una fila de SQL ignorando todas las claves y restricciones foráneas

DELETE FROM myTable where myTable.ID = 6850 IGNORE CONSTRAINTS 

O algo por el estilo.

+3

¿Ha considerado agregar índices a las columnas de referencia de clave en las tablas relacionadas? Si no está presente, esto permitiría a SQL determinar rápidamente si otras filas hacen referencia a la fila que está intentando eliminar, y puede brindarle un aumento sustancial en el rendimiento también ... –

+0

Puedo sugerir otro enfoque. En mi sistema, la mayoría de las tablas (de cientos) apuntan a un dbo.Company.Id. Incluso al eliminar una empresa vacía, sin referencias, solo hace que el DB verifique la integridad de FK en miles de millones de filas. Solución: solo use eliminaciones lógicas. – jean

Respuesta

30

Puede establecer las restricciones en esa tabla/columna para que no se verifique temporalmente, luego volver a habilitar las restricciones. forma general sería:

ALTER TABLE TableName NOCHECK CONSTRAINT ConstraintName 

volver a habilitar todas las restricciones con

ALTER TABLE TableName CHECK CONSTRAINT ConstraintName 

Asumo que esto sería temporal, aunque? Obviamente no querrás hacer esto de manera consistente.

1

En todas las tablas con claves externas que apuntan a éste, de uso:

ALTER TABLE MyOtherTable NOCHECK CONSTRAINT fk_name 
17

Sí, sólo tiene que ejecutar

DELETE FROM myTable where myTable.ID = 6850 

Y DEJAR DE MOTOR VERIFICAR LAS CONTRAS ENTRENOS.

Si está tratando de ser "inteligente" y deshabilitar las restricciones, tendrá que pagar un precio enorme: la habilitación de las restricciones tiene que verificar en cada fila en lugar de la que acaba de eliminar. Hay indicadores internos que SQL mantiene para saber que una restricción es 'confiable' o no. Su 'optimización' da 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.

Ver Guidelines for Disabling Indexes and Constraints y Non-trusted constraints and performance.

A menos que haya realizado mediciones sólidas que demostraron que la verificación de restricción de la operación DELETE es un cuello de botella de rendimiento, deje que el motor haga su trabajo.

+1

Solo para tener algunos números reales: eliminar registros de 10M de una tabla de 12M era en realidad 2 minutos más lento con 1 restricción temporalmente desactivada que con la activación (12:18 vs 10:28) - SQL-Server – Remco

+1

En algunas situaciones, como sembrar una tabla de dominio en DB recrear, es necesario y bien desactivar las comprobaciones FK, porque si encuentra que alguien ha agregado de alguna manera un elemento de búsqueda con el valor de código incorrecto, debe eliminar ese elemento y volver a crearlo con el código correcto y valor de texto – ProfK

7

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

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

+6

Puede ser muy útil en ciertas situaciones cuando realmente sabe lo que está haciendo y se asegura de que todas las restricciones se cumplan al final de la transacción. Por ejemplo, SqlBulkCopy ignora las restricciones de manera predeterminada, lo que tiene sentido cuando lo piensas. – chris

+1

@chris, la frase clave que realmente sabe lo que estás haciendo. En general, estas personas no están preguntando cómo desactivar las restricciones onteh de internet. – HLGEM

1

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

Para desactivar la restricción FK:

  1. expanda el objeto de base de datos [1]
  2. expanda el objeto de tabla dependiente [2]
  3. expanda la carpeta 'Keys'
  4. clic derecho en el 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 'clave Exteriores Relaciones'
  8. cerrar la pestaña diseñador de tablas
  9. cuando se confirman se le pida guardar los cambios
  10. plazo necesarias eliminar consultas
  11. vuelva a habilitar restricción de clave externa de la misma manera que acaba inhabilitado.

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

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

+0

Me pareció más fácil simplemente eliminar las tablas en el explorador de objetos y dejar que Batch las vuelva a crear (ejecute de nuevo la eliminación para las tablas que no se pudieron eliminar debido a las restricciones de FK). – appl3r

1

Sé que este es un hilo viejo, pero llegué 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 "NULO" (que no viola la restricción de clave externa) y luego borré todas las filas.

Cuestiones relacionadas