当我在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;
检查此链接。它可能会对你有所帮助。:(
此外,标识符(表名、列名(不应该用单引号括起来。单引号是字符串文字的分隔符。
我预计这个语句会因语法错误而失败:
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文本。