MySql: crear tabla si no existe, ¿de lo contrario truncar?
Pregunta
Aquí está la pregunta actualizada:
la consulta actual está haciendo algo como:
$sql1 = "TRUNCATE TABLE fubar";
$sql2 = "CREATE TEMPORARY TABLE IF NOT EXISTS fubar SELECT id, name FROM barfu";
La primera vez que se ejecuta el método que contiene esto, genera un mensaje de error al truncarlo ya que la tabla aún no existe.
¿Es mi única opción hacer el CREATE TABLE
, ejecuta el TRUNCATE TABLE
, y luego llenar la tabla?(3 consultas separadas)
La pregunta original era:
Me ha resultado difícil intentar descubrir si lo siguiente es posible en MySql sin tener que escribir block sql:
CREATE TABLE fubar IF NOT EXISTS ELSE TRUNCATE TABLE fubar
Si ejecuto truncar por separado antes de crear tabla y la tabla no existe, aparece un mensaje de error.Estoy intentando eliminar ese mensaje de error sin tener que agregar más consultas.
Este código se ejecutará usando PHP.
Solución
shmuel613, sería mejor actualizar su pregunta original en lugar de responder.Es mejor si hay un solo lugar que contenga la pregunta completa en lugar de distribuirla en una discusión.
La respuesta de Ben es razonable, excepto que parece tener un "no" cuando no lo quiere.Dejar caer la mesa sólo si no existir no es del todo correcto.
De hecho, necesitará varias declaraciones.O crea condicionalmente y luego completa:
- CREAR TABLA TEMPORAL SI NO EXISTE fubar (id int, nombre varchar(80))
- TABLA TRUNCADA fubar
- INSERTAR EN fubar SELECCIONAR * DESDE barfu
o simplemente soltar y recrear
- TABLA DE SOLTAR SI EXISTE fubar
- CREAR TABLA TEMPORAL fubar SELECCIONAR id, nombre DE barfu
Con SQL puro, esas son sus dos clases reales de soluciones.Me gusta más el segundo.
(Con un procedimiento almacenado podrías reducirlo a una sola declaración.Algo como:TruncateAndPopulate(fubar) Pero cuando escriba el código para TruncateAndPopulate(), dedicará más tiempo que simplemente usar el SQL anterior).
Otros consejos
Puede truncar después de "crear si no existe".Así siempre existirá...y estar siempre vacío en ese punto.
CREATE TABLE fubar IF NOT EXISTS
TRUNCATE TABLE fubar
ejecutar cualquier consulta si la tabla existe.
Uso: call Edit_table(database-name,table-name,query-string);
- El procedimiento comprobará la existencia del nombre de la tabla en el nombre de la base de datos y ejecutará la cadena de consulta si existe.El siguiente es el procedimiento almacenado:
DELIMITER $$ DROP PROCEDURE IF EXISTS `Edit_table` $$ CREATE PROCEDURE `Edit_table` (in_db_nm varchar(20), in_tbl_nm varchar(20), in_your_query varchar(200)) DETERMINISTIC BEGIN DECLARE var_table_count INT; select count(*) INTO @var_table_count from information_schema.TABLES where TABLE_NAME=in_tbl_nm and TABLE_SCHEMA=in_db_nm; IF (@var_table_count > 0) THEN SET @in_your_query = in_your_query; #SELECT @in_your_query; PREPARE my_query FROM @in_your_query; EXECUTE my_query; ELSE select "Table Not Found"; END IF; END $$ DELIMITER ;
qué tal si:
DROP TABLE IF EXISTS fubar;
CREATE TABLE fubar;
¿O quisiste decir que solo quieres hacerlo con una sola consulta?
Bueno, entonces no está mal.Para ser más específico, la consulta actual hace algo como:
$sql1 = "TRUNCATE TABLE fubar"; $sql2 = "CREATE TEMPORARY TABLE IF NOT EXISTS fubar SELECT id, name FROM barfu";
La primera vez que se ejecuta el método que contiene esto, genera un mensaje de error al truncarlo ya que la tabla aún no existe.
¿Mi única opción es hacer "CREAR TABLA", ejecutar "TRUNCAR TABLA" y luego llenar la tabla?(3 consultas separadas)
PD: ¡gracias por responder tan rápido!
Si estás usando PHP, usa mysql_list_tables para comprobar que la tabla existe antes de TRUNCARLA.