可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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;