如果MySQL中不存在ADD列

时间:2018-11-13 19:04:02

标签: mysql

当我在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;

2 个答案:

答案 0 :(得分:0)

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

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;

选中此link。它可能会帮助您。 :)

答案 1 :(得分:0)

过程中的

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文本。