with foreign example ejemplo delete sql-server sql-server-2008 tsql sql-delete truncate

sql-server - foreign - truncate table sql server ejemplo



Pros y contras de TRUNCATE vs DELETE FROM (11)

Creo que Eliminar y Truncar solo se puede revertir si la operación se ejecutó y se realizó una transacción explícita. De lo contrario, tendrías que realizar una restauración para recuperar los datos eliminados

¿Podría alguien darme una descripción general rápida de los pros y los contras de usar las dos afirmaciones siguientes:

TRUNCATE TABLE dbo.MyTable

vs

DELETE FROM dbo.MyTable

Parece que ambos hacen lo mismo cuando todo está dicho y hecho; pero debe haber diferencias entre los dos.


Esquema de Eliminar Vs Truncar en el servidor SQL

Para Artículo Completo, tome después de esta conexión: Eliminar Vs Truncar en SQL Server

/*Truncate - Syntax*/ TRUNCATE TABLE table_name /*Delete - Syntax*/ DELETE FROM table_name WHERE some_condition


La diferencia fundamental está en la forma en que se registran. DELETE y TRUNCATE se registran de forma diferente, pero ambos se pueden revertir exactamente de la misma manera. Todas las operaciones que cambian los datos se registran. En SQL Server no existe tal cosa como una operación no registrada.


Otra diferencia desde una perspectiva de seguridad es que TRUNCATE requiere privilegios ALTER en la tabla, mientras que DELETE simplemente requiere (tambor de lista) DELETE permisos en esa tabla.


Otra diferencia entre DELETE y TRUNCATE es el comportamiento cuando la tabla está dañada.

Por ejemplo:

DELETE FROM table_name;

Terminará con un error:

Msg 3314, nivel 21, estado 3, línea 1

Durante la anulación de una operación registrada en la base de datos ''...'', se produjo un error en el registro de registro ID (). Normalmente, la falla específica se registra previamente como un error en el servicio de registro de eventos de Windows. Restaure la base de datos o el archivo de una copia de seguridad o repare la base de datos.

Msg 0, nivel 20, estado 0, línea 0

Se produjo un error grave en el comando actual. Los resultados, si los hay, deben descartarse.

Mientras TRUNCATE funcionará:

TRUNCATE TABLE table_name; -- Command(s) completed successfully.


Otro punto clave que no se menciona en las otras respuestas es que TRUNCATE TABLE restablecerá su identidad a la semilla inicial , mientras que DELETE FROM continuará incrementándose desde donde se quedó.


Una cosa que es muy importante (imo) y no se menciona en otras respuestas es que TRUNCATE necesita el bloqueo de estabilidad del esquema, Sch-S , mientras que DELETE usa bloqueos de fila. Vamos a inspeccionar lo siguiente:

BEGIN TRANSACTION; BEGIN TRY -- Truncate below will take LCK_M_SCH_S lock for TABLE_A TRUNCATE TABLE TABLE_A -- Lets say the query below takes 5 hours to execute INSERT INTO TABLE_A SELECT * FROM GIANT_TABLE (NOLOCK) END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; THROW END CATCH IF @@TRANCOUNT > 0 COMMIT TRANSACTION;

Ahora supongamos que después de 1 a 2 minutos del inicio de esta consulta, digamos que intentamos ejecutar lo siguiente:

SELECT COUNT(*) FROM TABLE_A (NOLOCK)

Tenga en cuenta que usé la cláusula NOLOCK . ¿Qué crees que pasará ahora? Esta consulta esperará 5 horas. ¿Por qué? Porque la cláusula NOLOCK necesita el bloqueo Sch-S en TABLE_A pero esa cláusula TRUNCATE tiene a Sch-S . Como todavía no hemos confirmado la transacción, el bloqueo sigue TRUNCATE incluso después de la cláusula TRUNCATE . Sch-S bloqueo de Sch-S en una tabla básicamente significa que TABLE_A se está alterando mediante la adición / eliminación de columnas, etc. o se está truncando. Incluso no puedes ejecutar algo como a continuación:

SELECT object_id(''TABLE_A'')

Esto se estancará 5 horas también. Sin embargo, si reemplaza ese TRUNCATE con DELETE FROM , verá que no habrá ningún bloqueo Sch-S en la mesa y las consultas anteriores no se verán afectadas.


truncar no hace ningún registro, eliminar lo hace, así que si tienes un montón de registros, tu registro de transmisión es enorme


TRUNCATE TABLE no registra la transacción. Eso significa que es muy rápido para mesas grandes. El inconveniente es que no puede deshacer la operación.

DELETE FROM registros de cada fila que se está eliminando en los registros de transacciones para que la operación tarde un poco y haga que sus registros de transacciones crezcan de forma espectacular. Lo bueno es que puedes deshacer la operación si es necesario.


TRUNCATE no genera datos de reversión, lo que hace que sea muy rápido. Simplemente desasigna las páginas de datos utilizadas por la tabla.

Sin embargo, si está en una transacción y desea la capacidad de "deshacer" esta eliminación, debe utilizar DELETE FROM , que le permite deshacerse.

EDITAR: tenga en cuenta que lo anterior es incorrecto para SQL Server (pero sí se aplica a Oracle). En SQL Server, es posible deshacer una operación truncada si se encuentra dentro de una transacción y la transacción no se ha confirmado. Desde la perspectiva de SQL Server, una diferencia clave entre DELETE FROM y TRUNCATE es la this : "La instrucción DELETE elimina filas de una en una y registra una entrada en el registro de transacciones para cada fila eliminada. TRUNCATE TABLE elimina los datos desasignando las páginas de datos utilizado para almacenar los datos de la tabla y registra solo las desasignaciones de la página en el registro de transacciones ".

En otras palabras, hay menos registro durante un TRUNCATE porque solo las desasignaciones de página se registran en el registro de transacciones, mientras que con un DELETE FROM cada fila se graba el borrado. Esa es una de las razones por las que TRUNCATE es muy rápido.

Tenga en cuenta también que desde ese enlace de MSDN no puede truncar las tablas a las que hacen referencia las restricciones de clave externa, participar en una vista indexada o publicar mediante la replicación transaccional o la duplicación de fusión.

EDIT 2: Otro punto clave es que TRUNCATE TABLE restablecerá su identidad a la semilla inicial, mientras que DELETE FROM continuará incrementándose desde donde se quedó. Referencia: respuesta de Ben Robinson.


$connection = $this->getEntityManager()->getConnection(); $connection->exec("Truncate TABLE <tablename>;");