rendimiento - tablas grandes mysql
Alterar tabla si existe o crear si no existe (2)
Bueno, si estás usando un lenguaje de codificación haz:
SHOW TABLES LIKE ''myTable''
si devuelve un valor, llame al alter, o llame al crear.
Necesito ejecutar un instalador que también puede ser un actualizador. El instalador debe poder terminar teniendo un determinado esquema / estructura de la base de datos mysql, independientemente de si alguna de las tablas existió, omitió algunas columnas o no necesita cambiarse porque su estructura está actualizada.
¿Cómo puedo hacer una combinación elegante de ALTER
y CREATE
?
Estaba pensando que debe haber algo como "AGREGAR ... SI ... Duplicar"
Digamos que tengo la tabla A. En un cliente, la tabla tiene una columna -A1, y otro cliente tiene la misma tabla pero con la columna A1 y la columna A2.
Quiero que mi comando sql haga que la tabla A de ambos clientes contenga tres columnas: A1, A2 y A3.
Una vez más, mi script es un archivo sql que vuelco a mysql.
¿Cómo lo hago? Gracias :-)
MySQL INFORMATION_SCHEMA
base de datos al rescate:
-- First check if the table exists
IF EXISTS(SELECT table_name
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = ''db_name''
AND table_name LIKE ''wild'')
-- If exists, retreive columns information from that table
THEN
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = ''tbl_name''
AND table_schema = ''db_name'';
-- do some action, i.e. ALTER TABLE if some columns are missing
ALTER TABLE ...
-- Table does not exist, create a new table
ELSE
CREATE TABLE ....
END IF;
Más información:
- Manual de referencia de MySQL: Capítulo 19. Tablas INFORMATION_SCHEMA
- MySQL Reference Manual: La tabla INFORMATION_SCHEMA TABLES
- Manual de referencia de MySQL: la tabla INFORMATION_SCHEMA COLUMNS
ACTUALIZAR:
Otra opción, posiblemente más fácil, es eliminar la tabla existente y volver a crearla con el nuevo esquema. Para hacer esto, necesitas:
- Crear tabla temporal, una copia exacta de la tabla existente
- Rellena la tabla temporal con los datos de la tabla antigua
- Suelta la vieja mesa
- Crear la nueva tabla con el nuevo esquema.
- Rellene la tabla nueva con la información de la tabla temporal.
- Soltar tabla temporal.
Entonces, en código SQL:
CREATE TABLE old_table_copy LIKE old_table;
INSERT INTO old_table_copy
SELECT * FROM old_table;
DROP TABLE old_table;
CREATE TABLE new_table (...new values...);
INSERT INTO new_table ([... column names from old table ...])
SELECT [...column names from old table ...]
FROM old_table_copy;
DROP TABLE old_table_copy;
En realidad, el último paso, "Eliminar tabla temporal", se puede omitir durante un tiempo. Por si acaso, desearía tener algún tipo de copia de seguridad de la tabla anterior, "just-in-case".
Más información:
- MySQL Reference Manual: CREATE TABLE Syntax
- MySQL Reference Manual: INSERT Syntax
- MySQL Reference Manual: INSERT ... SELECT Syntax