Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

sobre tablas temporales (saber si existe)

Estas en el tema de sobre tablas temporales (saber si existe) en el foro de Mysql en Foros del Web. Hola a tod@s! Os explico desde el desconocimiento, por que la verdad, no acabo de ver la luz con el tema. Para empezar. He estado ...
  #1 (permalink)  
Antiguo 16/12/2009, 05:07
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
sobre tablas temporales (saber si existe)

Hola a tod@s!

Os explico desde el desconocimiento, por que la verdad, no acabo de ver la luz con el tema.

Para empezar. He estado buscando el tiempo de "vida" de una tabla temporal. y he encontrado que existe mientras se está ejecutando el script y que existe lo que dure la sesión, en los dos casos mientras no se utilice mysql_free_results().
La verdad es que casi todo lo que he encontrado era referido a SQL SERVER, que no sé hasta que punto es comparable con mysql, por que nunca lo he usado.

Mi caso: El resultado de una búsqueda se me guarda en una tabla temporal, y el resultado se puede acotar, dando a unos enlaces que generan una consulta sobre esta tabla.
Pasa que estos enlaces estas indexados por los buscadores, por lo que si alguien desde un buscador los clicka, al no existir la tabla temporal el resultado se me va a la porra.
Lo que quiero es saber si si existe la tabla temporal, para que si no existe se cree.
En principio es facil IF NOT EXIST CREATE TEMPORALY TABLE, pero antes de adentrarme en generar la tabla quiero saber si la tabla de verdad existe o no (el código no es mio y se me hace en ocasiones insostenible).

la tabla temporal se llama tmp

he probado lo siguiente:

Código PHP:
$prueba="select * from tempdb.NOMBRE_BD.tables where table_name like 'tmp'"
me devuelve:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.tables where table_name like 'tmp'' at line 1 No funciona.

Código PHP:
$prueba="select * from tempdb.NOMBRE_BD where table_name like 'tmp'"
quitando .tables me dice:Table 'tempdb.NOMBRE_BD' doesn't exist
claro...no es el nombre de la tabla.

Código PHP:
$prueba="SHOW FULL TABLES"
esta me devuelve los nombres de las tablas normales, no me dice nada de tmp no se si por que no existe o por que según he leido el tratamiento de las tablas normales no es igual que el de las temporales.

Código PHP:
$prueba="SHOW FULL TABLES LIKE 'NOMBRE_BD.tempdb.tmp'"
esta es en la que más dudo, me devuelve false y no sé si es por que no existe o por que me mira sólo las normales.

Código PHP:
$prueba"SELECT * FROM tmp LIMIT 1, 10"
esta me dice: Table 'NOMBRE_BD.tmp' doesn't exist
Creo que es, por que no me lo está mirando donde se guardan las temporales que según tengo entendido es en tempdb.

Me podeis dar alguna orientación?
Muchas gracias de antemano.
  #2 (permalink)  
Antiguo 16/12/2009, 06:03
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: sobre tablas temporales (saber si existe)

Vamos por parte:

1. No se puede leer el nombre de las tablas desde dentro de una base determinada. Los nombres de bases, tablas, campos, procedimientos, funciones y triggers se almacenan en una base específica de MySQL, y esta es INFORMATION_SCHEMA (Capítulo 22. La base de datos de información INFORMATION_SCHEMA), para consultar la cual, obviamente, necesitas permisos elevados, o al menos un usuario que no tenga restricciones de base.

2. Sobre si existen o no tablas temporales, la respuesta a eso la puedes encontrar en el manual: Capítulo 14. Motores de almacenamiento de MySQL y tipos de tablas, específicamente en 14.3. El motor de almacenamiento MEMORY (HEAP)

3. Existe otra tabla de tipo temporal que se declara en el CREATE TABLE: 13.1.5. Sintaxis de CREATE TABLE, sobre el tipo TEMPORARY, el manual explica:
Cita:
Puede usar la palabra TEMPORARY al crear una tabla. Una tabla TEMPORARY es visible sólo para la conexión actual, y se borra automáticamente cuando la conexión se cierra. Esto significa que dos conexiones distintas pueden usar el mismo nombre de tabla temporal sin entrar en conflicto entre ellas ni con tablas no TEMPORARY con el mismo nombre. (La tabla existente se oculta hasta que se borra la tabla temporal.) En MySQL 5.0, debe tener el permiso CREATE TEMPORARY TABLES para crear tablas temporales.
4. Es muy importante que cuando cambies de DBMS de trabajo le des una leída al manual de referencia, porque diferentes DBMS (Oracle, Postgre, SQL server, DB2,etc) le agregan al estándar ANSI-SQL extensiones, funciones, métodos, cláusulas y recursos propios. No todo es portable, y no todo existe en todos ni de la misma forma.

Revisa os links que te puse y luego pregunta lo que no se comprenda bien.

Saludos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 16/12/2009, 06:48
 
Fecha de Ingreso: noviembre-2007
Mensajes: 382
Antigüedad: 16 años, 5 meses
Puntos: 16
Respuesta: sobre tablas temporales (saber si existe)

Lo primero de todo. Muchisimas gracias por la ayuda, y los enlaces.
He visto las tablas desde INFORMATION_SCHEMA y la temporal no sale. Entiendo entonces que es que no existe??
  #4 (permalink)  
Antiguo 16/12/2009, 07:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: sobre tablas temporales (saber si existe)

En INFORMATION_SCHEMA existen sólo las tablas físicas. Una tabla TEMPORARY no existe desde el punto de vista físico (entre otras cosas por esa razón tiene también un límite de registros, y ciertos campos no pueden existir en ella), ya que solamente existe en memoria, y depende de la conexión (como se lee en el post que te puse).
Desde ese punto de vista no tiene permanencia ni entidad. Es como si fuese una variable: A una variable no la puedes buscar por su nombre por fuera del método o función que la crea y usa. Para transferirla, se transfiere su valor, o bien su referencia en memoria.
Las tablas MEMORY, por su parte, son algo diferentes: no se pierden las tablas, sino su contenido:
Cita:
Cada tabla MEMORY está asociada con un fichero de disco. El nombre de fichero comienza con el nombre de la tabla y tiene una exensión de .frm para indicar que almacena la definición de la tabla.

Para especificar explícitamente que quiere una tabla MEMORY, indíquelo con una opción ENGINE :

Cita:
CREATE TABLE t (i INT) ENGINE = MEMORY;
Como indica su nombre, las tablas MEMORY se almacenan en memoria y usan índices hash por defecto. Esto las hace muy rápidas, y muy útiles para crear tablas temporales. Sin embargo, cuando se apaga el servidor, todos los datos almacenados en las tablas MEMORY se pierde. Las tablas por sí mismas continúan existiendo ya que sus definiciones se almacenan en ficheros .frm en disco, pero están vacías cuando reinicia el servidor.
Desde esa óptica, entonces, las tablas TEMPORARY jamás aparecerán en INFORMATION_SCHEMA. Es tu responsabilidad como programador y DBA saber qué existe y qué no allí, y recordar en qué momento las cosas desaparecen.
Te recalco esto sobre las TEMPORARY, que es muy importante:
Cita:
Esto significa que dos conexiones distintas pueden usar el mismo nombre de tabla temporal sin entrar en conflicto entre ellas ni con tablas no TEMPORARY con el mismo nombre. (La tabla existente se oculta hasta que se borra la tabla temporal.) E
Esto quiere decir que la tabla pertenece y es visible sólo para el usuario que la creó, en la conexión en que la creó. La conexión se cierra y la tabla desaparece.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:26.