我想创建一个触发器来自动创建一个uuid。所以我编写这样的代码,它编译得很好,但是当我调用它时运行错误。如何修复它?
delimiter//
DROP PROCEDURE IF EXISTS sp_uuid_auto;
CREATE PROCEDURE sp_uuid_auto(IN triggerName VARCHAR(32),
IN tableName VARCHAR(32),IN idName VARCHAR(32))
begin
drop trigger if exists triggerName;
set @v_sqlStr=concat('create TRIGGER ', triggerName,
' before insert on ',tableName,' FOR EACH ROW if (new.id='''' or new.id is null) then
set new.id= REPLACE(uuid(),''-'','''');
end if ;');
PREPARE statement FROM @v_sqlStr;
EXECUTE statement;
-- DEALLOCATE PREPARE statement;
end;
//
我称之为程序:call sp_uuid_auto('tri_t_menu','t_menu','id');
结果是:
1295 - This command is not supported in the prepared statement protocol yet
答案 0 :(得分:2)
在准备好的语句中允许的#34; SQL语法标题下阅读https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html。"它列出了您可以在PREPARE
中使用的语句类型。
之后它说:
MySQL 5.7不支持其他语句。
CREATE TRIGGER语句不在列出的语句中,因此它属于"其他语句"类别。你不能在PREPARE中创建TRIGGER。
因此,您无法在存储过程中执行此操作。您必须在应用程序中创建触发器,并在提交CREATE TRIGGER语句之前格式化动态表名称。