mysql ALTER TABLE if column not exists

匿名 (未验证) 提交于 2019-12-03 02:13:02

问题:

I have this code:

ALTER TABLE `settings` ADD COLUMN `multi_user` TINYINT(1) NOT NULL DEFAULT 1 

And I want to alter this table only if this column doesnt exist.

I'm trying a lot of differents ways, but nothing works:

ALTER TABLE `settings` ADD COLUMN IF NOT EXISTS `multi_user` TINYINT(1) NOT NULL DEFAULT 1 

With procedure:

DELIMITER $$ CREATE PROCEDURE Alter_Table() BEGIN     DECLARE _count INT;     SET _count = (  SELECT COUNT(*)                      FROM INFORMATION_SCHEMA.COLUMNS                     WHERE   TABLE_NAME = 'settings' AND                              COLUMN_NAME = 'multi_user');     IF _count = 0 THEN         ALTER TABLE `settings` ADD COLUMN `multi_user` TINYINT(1) NOT NULL DEFAULT 1     END IF; END $$ DELIMITER ;  

I got error in END IF, then in END and then in 1

How can I make this as simple as possible?

回答1:

Use the following in a stored procedure:

IF NOT EXISTS( SELECT NULL             FROM INFORMATION_SCHEMA.COLUMNS            WHERE table_name = 'tablename'              AND table_schema = 'db_name'              AND column_name = 'columnname')  THEN    ALTER TABLE `TableName` ADD `ColumnName` int(1) NOT NULL default '0';  END IF; 


回答2:

Use PREPARE/EXECUTE and querying the schema. The host doesn't need to have permission to create or run procedures :

SET @dbname = DATABASE(); SET @tablename = "tableName"; SET @columnname = "colName"; SET @preparedStatement = (SELECT IF(   (     SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS     WHERE       (table_name = @tablename)       AND (table_schema = @dbname)       AND (column_name = @columnname)   ) > 0,   "SELECT 1",   CONCAT("ALTER TABLE ", @tablename, " ADD ", @columnname, " INT(11);") )); PREPARE alterIfNotExists FROM @preparedStatement; EXECUTE alterIfNotExists; DEALLOCATE PREPARE alterIfNotExists; 


回答3:

Here is a solution that does not involve querying INFORMATION_SCHEMA, it simply ignores the error if the column does exist.

DROP PROCEDURE IF EXISTS `?`; DELIMITER // CREATE PROCEDURE `?`() BEGIN   DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;   ALTER TABLE `table_name` ADD COLUMN `column_name` INTEGER; END // DELIMITER ; CALL `?`(); DROP PROCEDURE `?`; 

P.S. Feel free to give it other name rather than ?



回答4:

hope this will help you

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'tbl_name' AND table_schema = 'db_name' AND column_name = 'column_name' 

or

delimiter '//'  CREATE PROCEDURE addcol() BEGIN IF NOT EXISTS( SELECT * FROM information_schema.COLUMNS WHERE COLUMN_NAME='new_column' AND TABLE_NAME='tablename' AND TABLE_SCHEMA='the_schema' ) THEN     ALTER TABLE `the_schema`.`the_table`     ADD COLUMN `new_column` TINYINT(1) NOT NULL DEFAULT 1;;  END IF; END; //  delimiter ';'  CALL addcol();  DROP PROCEDURE addcol; 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!