functions - MySQL agregar columna si no existe
sintaxis mysql create table (6)
Está utilizando la sintaxis de MS SQL Server en MySQL.
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ''email_subscription'' AND COLUMN_NAME = ''subscribe_all'')
THEN
ALTER TABLE email_subscription
ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
ADD COLUMN subscribe_category varchar(512) DEFAULT NULL;
He echado un vistazo a gran cantidad de ejemplos. pero esta consulta no funciona, tengo error de:
ERROR 1064 (42000): Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de ''SI NO EXISTE'' (SELECCIONE * DE INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''en la línea 1
No hay una sintaxis equivalente para lograr esto en una sola declaración MySQL.
Para obtener algo similar, puede:
1) intente agregar la columna con una ALTER TABLE, y permita que MySQL genere un error si ya existe una columna con ese nombre en la tabla, o
2) consulte la vista information_schema.columns para verificar si existe una columna con ese nombre en la tabla.
Tenga en cuenta que realmente necesita verificar el cuadro de esquema, así como el nombre de tabla:
SELECT column_name
FROM information_schema.columns
WHERE table_schema = ''foo''
AND table_name = ''email_subscription''
AND column_name = ''subscribe_all''
y en base a eso, decide si ejecutar ALTER TABLE
Si su host no le da permiso para crear o ejecutar procedimientos, creo que encontré otra forma de hacerlo utilizando PREPARE / EXECUTE y consultando el esquema:
SET @s = (SELECT IF(
(SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = ''table_name''
AND table_schema = DATABASE()
AND column_name = ''col_name''
) > 0,
"SELECT 1",
"ALTER TABLE table_name ADD col_name VARCHAR(100)"
));
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
También agregue la condición para el nombre de la base de datos para verificar la existencia de la columna
Prueba esto:
DELIMITER $$
CREATE PROCEDURE sp_AlterTable()
BEGIN
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = ''dbName'' AND
TABLE_NAME = ''email_subscription'' AND
COLUMN_NAME = ''subscribe_all'') THEN
ALTER TABLE email_subscription
ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
ADD COLUMN subscribe_category VARCHAR(512) DEFAULT NULL;
END IF;
END $$
DELIMITER ;
puedes crear un procedimiento para la consulta,
DELIMITER $$
CREATE PROCEDURE Alter_Table()
BEGIN
DECLARE _count INT;
SET _count = ( SELECT COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ''email_subscription'' AND
COLUMN_NAME = ''subscribe_all'');
IF _count = 0 THEN
ALTER TABLE email_subscription
ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
ADD COLUMN subscribe_category varchar(512) DEFAULT NULL;
END IF;
END $$
DELIMITER ;
SET @s = (SELECT IF(
(SELECT COUNT(column_name)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = ''oc_bitcoin_wallets_receive''
AND table_schema = ''k_opencart2''
AND column_name = ''test3''
) > 0,
"SELECT 1",
"ALTER TABLE `oc_bitcoin_wallets_receive` ADD COLUMN `test3` INT NOT NULL AFTER `test2`;"
));
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Valores para editar: oc_bitcoin_wallets_receive - nombre de tabla, k_opencart2 - nombre de base de datos, test3 - nombre de la nueva columna, oc_bitcoin_wallets_receive - segunda tabla de ubicación test3 - segunda columna de ubicación, test2 - nombre de la columna antes de la nueva columna.