Página 1 de 1

Tema: 61. Id Pregunta: 1802.

Publicado: 05 Feb 2017, 20:36
por bits
53) En SQL, ¿cuál de las siguientes sentencias es correcta?
a) TRUNCATE TABLE, borra la tabla de la base de datos
b) TRUNCATE TABLE es funcionalmente igual a DELETE TABLE
c) TRUNCATE TABLE debe ser usado con la cláusula WHERE
d) Ninguna de las anteriores es correcta
Da como buena la a, ¿no sería la d?

DELETE: Borra una serie de filas de la tabla. Podemos usar una claúsula WHERE para limitar las filas a borrar, a las que cumplan una condición.

TRUNCATE: A diferencia de DELETE, TRUNCATE elimina todas las filas de la tabla sin borrar la tabla. También resetea los contadores de auto incremento a 0. No borra la tabla como tal, la llamada estructura, por lo que luego puede comenzar a hacer inserciones. Tampoco se pueden recuperar los registros eliminados.

Re: Tema: 61. Id Pregunta: 1802.

Publicado: 06 Feb 2017, 10:03
por grgpeople
Yo creo que la opción correcta es la b).
La opción a) no es correcta, porque TRUNCATE no borra la tabla, borra las filas de la tabla. Para borrar la tabla hay que usar DROP TABLE.
La opción c), descartada.
Y la opción b), es cierto. Funcionalmente, si pones DELETE TABLE, sin especificar nada con WHERE, te va a borrar todas las filas de la tabla, que es lo mismo que hace TRUNCATE. Indica funcionalmente, creo que porque internamente está la diferencia de ser una sentencia de tipo DDL o DML.

Re: Tema: 61. Id Pregunta: 1802.

Publicado: 06 Feb 2017, 10:14
por Montijeño
Uhmmm... Yo creo que ya depende de lo exquisito que se quiera poner uno. Porque a mí se me pondría la mosca detrás de la oreja al leer lo de "DELETE TABLE" en lugar de "DELETE FROM nombre_tabla" (que es cierto que sin cláusula WHERE hace el mismo efecto funcionalmente que el TRUNCATE TABLE nombre_tabla).

Siendo exquisitos, daría la d) como correcta. Siendo menos exquisitos, la b).

Saludos!

Re: Tema: 61. Id Pregunta: 1802.

Publicado: 06 Feb 2017, 10:23
por grgpeople
Montijeño escribió:Uhmmm... Yo creo que ya depende de lo exquisito que se quiera poner uno. Porque a mí se me pondría la mosca detrás de la oreja al leer lo de "DELETE TABLE" en lugar de "DELETE FROM nombre_tabla" (que es cierto que sin cláusula WHERE hace el mismo efecto funcionalmente que el TRUNCATE TABLE nombre_tabla).

Siendo exquisitos, daría la d) como correcta. Siendo menos exquisitos, la b).

Saludos!
Ya me ha puesto a mi también la mosca detrás de la oreja y he seguido buscando. Mirad lo que he encontrado:
https://technet.microsoft.com/es-es/lib ... .105).aspx

"FROM" es un argumento opcional. Creo que tiene más posibilidades de ser correcta la b).

Re: Tema: 61. Id Pregunta: 1802.

Publicado: 06 Feb 2017, 10:38
por Montijeño
Vaya, pues parece que así es: http://stackoverflow.com/questions/4484 ... -use-where

Damos la b) como ganadora pues.

Re: Tema: 61. Id Pregunta: 1802.

Publicado: 06 Feb 2017, 11:17
por bits
Vaya, yo tampoco sabía que el FROM era opcional. Pues nos quedamos con la b, que aunque delete y truncate tengan sus diferencias, funcionalmente sí que hacen lo mismo.

Re: Tema: 61. Id Pregunta: 1802.

Publicado: 06 Feb 2017, 20:04
por sray
Yo no daría por buena la b), en primer lugar porque no estoy seguro de que en el estándar SQL la opción FROM del DELETE sea opcional. He intentado buscarlo pero no he encontrado que lo sea. El hecho de que algunas SGBD te permitan que el FROM sea opcional, no quiere decir que en el estándar lo sea.

De todas formas la pregunta no especifica tampoco si se refiere al estándar, aunque al decir SQL a secas yo entiendo que se refiere al estándar, ¿no?

Independientemente de lo anterior, TRUNCATE no funciona exactamente igual que DELETE. Según he visto en Wikipedia, TRUNCATE no lanza el evento ON DELETE, mientras que DELETE sí lo lanza, por lo que las claves ajenas que existan, si las hay, se actualizarán con DELETE pero no con TRUNCATE.
Wikipedia escribió:TRUNCATE TABLE cannot be used when a foreign key references the table to be truncated, since TRUNCATE TABLE statements do not fire triggers. This could result in inconsistent data because ON DELETE/ON UPDATE triggers would not fire.
https://en.wikipedia.org/wiki/Truncate_(SQL)

Re: Tema: 61. Id Pregunta: 1802.

Publicado: 07 Feb 2017, 10:16
por Montijeño
¿Que la pregunta es mejorable? Sin duda.
¿Que de las opciones propuestas el "funcionalmente" le da todas las probabilidades de acierto a la b)? Creo que también.

Siendo muy muy exhaustivos como ese detalle que citas, la verdad es que no me atrevería a marcar nada ;)

Re: Tema: 61. Id Pregunta: 1802.

Publicado: 07 Feb 2017, 11:31
por grgpeople
sray escribió: Independientemente de lo anterior, TRUNCATE no funciona exactamente igual que DELETE. Según he visto en Wikipedia, TRUNCATE no lanza el evento ON DELETE, mientras que DELETE sí lo lanza, por lo que las claves ajenas que existan, si las hay, se actualizarán con DELETE pero no con TRUNCATE.
Wikipedia escribió:TRUNCATE TABLE cannot be used when a foreign key references the table to be truncated, since TRUNCATE TABLE statements do not fire triggers. This could result in inconsistent data because ON DELETE/ON UPDATE triggers would not fire.
https://en.wikipedia.org/wiki/Truncate_(SQL)
Cierto, no funciona exactamente igual. Nadie dice que lo haga. La respuesta dice, funcionalmente. Vaya, que metes las dos funciones en una caja negra, le das a ejecutar, y viendo el resultado tú no sabrías decir qué caja contiene cada función.

Re: Tema: 61. Id Pregunta: 1802.

Publicado: 02 Ago 2018, 12:13
por _0p0s1t0r_
Hola, retomo el hilo aunque sea del año pasado...

En la última versión de los test existe la siguiente pregunta (mismo contenido, pero id de pregunta diferente: 4052)
34) En SQL, ¿cuál de las siguientes sentencias es correcta? [MAL] Tema: 61. Id Pregunta: 4052.
a) TRUNCATE TABLE, borra la tabla de la base de datos
b) TRUNCATE TABLE es funcionalmente igual a DELETE TABLE
c) TRUNCATE TABLE debe ser usado con la cláusula WHERE
d) Ninguna de las anteriores es correcta
En este caso el test da por válida la "a) TRUNCATE TABLE, borra la tabla de la base de datos". Entiendo que la válida debería ser la "b) TRUNCATE TABLE es funcionalmente igual a DELETE TABLE" tal y como se ha comentado previamente en el hilo.

Muchas gracias.

Saludos.

[EDIT]

El test exacto del tema 61 es el "test_tema_T61_0003.html".