Con MSSQL2005, ¿puedo truncar una tabla con una restricción de clave externa si primero trunco la tabla secundaria (la tabla con la clave primaria de la relación FK)?
Sé que puedo
- Use una
DELETE
cláusula sin y luegoRESEED
la identidad (o) - Elimina el FK, trunca la tabla y vuelve a crear el FK.
Pensé que mientras truncara la tabla secundaria antes que la matriz, estaría bien sin hacer ninguna de las opciones anteriores, pero obtengo este error:
No se puede truncar la tabla 'TableName' porque está siendo referenciada por una restricción FOREIGN KEY.
fuente
Tenga en cuenta que esto probablemente no sea lo que desearía si tiene más de millones de registros, ya que es muy lento.
fuente
Debido a que
TRUNCATE TABLE
es un comando DDL , no puede verificar si los registros en la tabla están siendo referenciados por un registro en la tabla secundaria.Es por eso que
DELETE
funciona yTRUNCATE TABLE
no funciona: porque la base de datos puede asegurarse de que otro registro no haga referencia a ella.fuente
Sin
ALTER TABLE
Como procedimiento almacenado
https://github.com/reduardo7/TableTruncate
Tenga en cuenta que esto probablemente no sea lo que desearía si tiene millones de registros, ya que es muy lento.
fuente
La solución que @denver_citizen proporcionó anteriormente no funcionó para mí, pero me gustó su espíritu, así que modifiqué algunas cosas:
Para el beneficio del público, aquí está el script actualizado:
fuente
use el siguiente comando después de eliminar todas las filas de esa tabla mediante la instrucción delete
EDITAR: sintaxis corregida para SQL Server
fuente
TRUNCATE
evita el registro y es considerablemente más rápido queDELETE
para tablas grandes. Como tal, esta no es una verdadera solución equivalente.Bueno, como no encontré ejemplos de la solución muy simple que utilicé, que es:
Aquí va:
1) Encuentre el nombre de la clave externa que está causando la falla (por ejemplo: FK_PROBLEM_REASON, con el campo
ID
, de la tablaTABLE_OWNING_CONSTRAINT
) 2) Elimine esa clave de la tabla:3) Truncar tabla deseada
4) Vuelva a agregar la clave a esa primera tabla:
Eso es.
fuente
Aquí hay un script que escribí para automatizar el proceso. Espero que ayude.
fuente
sys.foreign_keys
tabla. ( Referencia )puede seguir este paso,
reseeding table
puede eliminar los datos de la tabla.Si aparece algún error, debe reiniciar la tabla principal.
fuente
fuente
Si entiendo correctamente, lo que desea hacer es tener un entorno limpio para configurar la base de datos que implique pruebas de integración.
Mi enfoque aquí sería dejar caer todo el esquema y recrearlo más tarde.
Razones:
fuente
Encontrado en otra parte de la web
fuente
No puede truncar una tabla si no elimina las restricciones. Una desactivación tampoco funciona. necesitas dejarlo todo. Hice un script que elimina todas las restricciones y luego lo recrea.
Asegúrese de envolverlo en una transacción;)
fuente
Las respuestas de @denver_citizen y @Peter Szanto no funcionaron para mí, pero las modifiqué para tener en cuenta:
fuente
truncar no funcionó para mí, eliminar + volver a colocar es la mejor salida. En caso de que haya algunos de ustedes que necesiten iterar sobre una gran cantidad de tablas para realizar la eliminación + reposición, es posible que se encuentren problemas con algunas tablas que no tienen una columna de identidad, el siguiente código verifica si existe una columna de identidad antes de intentar volver a sembrar
fuente
Escribí las siguientes formas y traté de parametrizarlas, para que pueda Ejecutarlas en un
Query document
O Haga que sea útilSP
con ellas fácilmente .A) Eliminar
Si su tabla no tiene millones de registros, esto funciona bien y no tiene ningún comando Alter :
B) Truncar
Si su tabla tiene millones de registros o no tiene ningún problema con el comando Alter en sus códigos, use este:
fuente
Es mi solución a este problema. Lo usé para alterar PK, pero la idea es la misma. Espero que esto sea útil)
fuente
Para
MS SQL
, al menos, las versiones más nuevas, puede deshabilitar las restricciones con un código como este:fuente
Lo siguiente funciona para mí incluso con restricciones FK, y combina las siguientes respuestas para descartar solo las tablas especificadas :
Nota:
Creo que todavía ayuda declarar las tablas en el orden en que desea que se eliminen (es decir, eliminar dependencias primero). Como se ve en esta respuesta , en lugar de nombres específicos de bucle, podría sustituir todas las tablas con
fuente
DELETE
No es lo mismo queTRUNCATE
. Esto llenará sus registros de transacciones.Si ninguna de estas respuestas funcionó como en mi caso, haga esto:
¡Buena suerte!
fuente
Eliminar y luego restablecer el incremento automático:
entonces
fuente
La única forma es soltar claves foráneas antes de truncar. Y después de truncar los datos, debe volver a crear los índices.
El siguiente script genera el SQL requerido para eliminar todas las restricciones de clave externa.
A continuación, el siguiente script genera el SQL requerido para volver a crear claves foráneas.
Ejecute el script generado para eliminar todas las claves foráneas, truncar tablas y luego ejecute el script generado para volver a crear todas las claves foráneas.
Las consultas se toman desde aquí .
fuente
En SSMS tuve un diagrama abierto que muestra la clave. Después de eliminar la clave y truncar el archivo, actualicé y luego volví a enfocarme en el diagrama y creé una actualización al borrar y restaurar un cuadro de identidad. Al guardar el Diagrama, apareció un cuadro de diálogo Guardar, que un cuadro de diálogo "Se realizaron cambios en la base de datos mientras trabajaba", al hacer clic en Sí, se restauró la Clave y se restauró de la copia enganchada en el Diagrama.
fuente
Si está haciendo esto en cualquier tipo de frecuencia, diablos, incluso en un horario, absolutamente, inequívocamente, nunca usaría una declaración DML. El costo de escribir en el registro de transacciones es demasiado alto, y configurar toda la base de datos en
SIMPLE
modo de recuperación para truncar una tabla es ridículo.La mejor manera, desafortunadamente, es la forma difícil o laboriosa. Ese ser:
Mi proceso para hacer esto implica los siguientes pasos:
Guiones de esta naturaleza deben hacerse dentro de una
begin tran
y decommit tran
bloque.fuente
Me acabo de dar cuenta de que puede usar la tabla TRUNCATE en una tabla primaria con restricciones de clave externa en un elemento secundario siempre que DESACTIVE las restricciones en la tabla secundaria primero. P.ej
Clave externa CONSTRAINT child_par_ref en la tabla secundaria, referencias PARENT_TABLE
fuente
La forma más fácil:
1 - Ingresar en phpmyadmin
2 - Hacer clic en el nombre de la tabla en la columna izquierda
3 - Hacer clic en Operación (menú superior)
4 - Hacer clic en "Vaciar la tabla (TRUNCATE)
5 - Desactivar cuadro" Habilitar comprobaciones de clave externa "
6 - Listo !
Enlace al tutorial de imagen
Tutorial: http://www.imageno.com/wz6gv1wuqajrpic.html
(lo siento, no tengo suficiente reputación para cargar imágenes aquí: P)
fuente
Podrías intentarlo
DELETE FROM <your table >;
.El servidor le mostrará el nombre de la restricción y la tabla, y al eliminar esa tabla puede eliminar lo que necesita.
fuente
referencia - truncar tabla restringida de clave externa
Trabajando para mí en MYSQL
fuente