sintaxis functions entre diferencias diferencia create mysql sql

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.