【问题标题】:ADD column if not exists in mysql [duplicate]如果mysql中不存在则添加列[重复]
【发布时间】:2018-11-13 19:04:01
【问题描述】:

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

【问题讨论】:

  • 返回给你的错误是什么?

标签: mysql


【解决方案1】:

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

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。它可能会帮助你。 :)

【讨论】:

    【解决方案2】:

    过程中的 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 文本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 2019-03-12
      • 2010-11-01
      • 1970-01-01
      相关资源
      最近更新 更多