当我在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;
答案 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文本。