如果mysql中不存在ADD列



当我在mysql5.7上运行这个时,我一直收到一个错误我做错了什么。我基本上只想添加一列,如果该列还不存在

DROP PROCEDURE IF EXISTS ALIASCOLUMN;
DELIMITER //
CREATE PROCEDURE ALIASCOLUMN()
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
ALTER TABLE 'human_api_procedure' ADD COLUMN 'alias' varchar(255);
END //
DELIMITER;
CALL ALIASCOLUMN();
DROP PROCEDURE ALIASCOLUMN;

在存储过程中使用以下内容:

IF NOT EXISTS( SELECT *
FROM 'tablename'
WHERE table_name = 'tablename'
AND table_schema = 'db_name'
AND column_name = 'columnname')  THEN
ALTER TABLE `human_api_procedure` ADD `alias` varchar(255) ;
END IF;

检查此链接。它可能会对你有所帮助。:(

过程中的DDL语句必须作为动态SQL执行。(我认为这是真的,我需要检查文档进行验证。(

此外,标识符(表名、列名(不应该用单引号括起来。单引号是字符串文字的分隔符。

我预计这个语句会因语法错误而失败:

ALTER TABLE 'human_api_procedure' ADD COLUMN 'alias' varchar(255)

这个

ALTER TABLE  human_api_procedure  ADD COLUMN  alias  varchar(255)
^                   ^            ^     ^

或者这个

ALTER TABLE `human_api_procedure` ADD COLUMN `alias` varchar(255)
^                   ^            ^     ^

将是有效的语法。如果sql_mode中包含ANSI_quotes,我们也可以在标识符周围使用双引号。


要在MySQL存储程序的上下文中执行ALTER TABLE语句,我们可以执行以下操作:

DELIMITER $$
CREATE PROCEDURE aliascolumn()
BEGIN
SET @sql = 'ALTER TABLE human_api_procedure ADD COLUMN alias varchar(255)';
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$ 
DELIMITER ;

MySQL允许例程包含DDL语句,如CREATE和DROP。

https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html

上面演示的使用PREPARE/EXECUTE/DEALLOCATE的模式将允许执行动态SQL,而不仅仅是静态SQL文本。

最新更新