Estoy tratando de escribir una consulta que verifique si una tabla específica en MySQL tiene una columna específica, y si no, créala. De lo contrario no hagas nada. Este es realmente un procedimiento fácil en cualquier base de datos de clase empresarial, pero MySQL parece ser una excepción.
Pensé algo como
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='prefix_topic' AND column_name='topic_last_update')
BEGIN
ALTER TABLE `prefix_topic` ADD `topic_last_update` DATETIME NOT NULL;
UPDATE `prefix_topic` SET `topic_last_update` = `topic_date_add`;
END;
funcionaría, pero falla mucho. ¿Hay alguna manera?
Respuestas:
Esto funciona bien para mi.
Con PHP sería algo así como ...
fuente
@julio
Gracias por el ejemplo de SQL. Intenté la consulta y creo que necesita una pequeña modificación para que funcione correctamente.
Eso funcionó para mí.
¡Gracias!
fuente
IF
, etc. Consulte stackoverflow.com/questions/7384711/... para ver un ejemplo de cómo envolver un procedimiento. la prueba para la columna y la declaración condicional DML.Solo para ayudar a cualquiera que esté buscando un ejemplo concreto de lo que @Mchl estaba describiendo, intente algo como
SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' AND COLUMN_NAME = 'my_column'
Si devuelve falso (cero resultados), entonces sabe que la columna no existe.
fuente
TABLE_NAME = 'my_table'
, TABLE_SCHEMA es el esquema en el que se encuentra la tabla. Es decirSELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' AND COLUMN_NAME = 'my_column'
La siguiente es otra forma de hacerlo usando PHP simple sin la base de datos information_schema:
fuente
isset()
trow 'false' si la clave de matriz existe pero el valor es NULL . Es mejor usararray_key_exists()
comoif( !array_key_exists( 'my_new_column', $mycol ) )
isset()
cheque. No resuelve la pregunta, pero es mejor si ya necesita ejecutar la consulta de selección y tener el resultado en la memoria.Lancé este procedimiento almacenado junto con un comienzo de los comentarios de @ lain anteriores, algo bueno si necesita llamarlo más de unas pocas veces (y no necesita php):
Trabajando con
fieldExists
fuente
ExpirationDate
campo. 😊Seleccione solo column_name del esquema de información y ponga el resultado de esta consulta en variable. Luego pruebe la variable para decidir si la tabla necesita ser alterada o no.
PD: No olvide especificar también TABLE_SCHEMA para la tabla COLUMNS.
fuente
Estoy usando este script simple:
Funciona si ya está conectado a la base de datos.
fuente
Muchas gracias a Mfoo, que ha puesto el script realmente agradable para agregar columnas dinámicamente si no existe en la tabla. He mejorado su respuesta con PHP . El script además lo ayuda a encontrar cuántas tablas realmente necesitaban 'Agregar columna' mysql comand. Solo prueba la receta. Funciona como encanto.
fuente
Este trabajo para mí con muestra PDO:
fuente
NO coloque ALTER TABLE / MODIFY COLS ni ninguna otra operación de mod de tabla dentro de una TRANSACTION. Las transacciones son para poder revertir un error de CONSULTA, no para ALTERACIONES ... se producirá un error cada vez que se realice una transacción.
Simplemente ejecute una consulta SELECT * en la tabla y verifique si la columna está allí ...
fuente
ALTER
(y DDL así) en MySQL de hecho comprometen (implícitamente) la transacción. Pero el uso de SELECT * generaría una gran sobrecarga en la red solo para verificar la existencia de la columna. En su lugar, puede intentarSELECT my_col_to_check FROM t LIMIT 0
: si mysql genera un error, entonces la columna probablemente no exista (aún así, verifique el error, ¡ya que podría ser un problema de red o lo que sea!); Si no genera ningún error, existe una columna. No estoy seguro de que sea la mejor manera de verificar la existencia de columnas.