在“INSERT ON”子句中使用用户变量

4
我尝试使用用户定义的变量来创建一个干净的触发器,以下是我的代码:
SET @target_bdd = 'trigger_second';
SET @trigger_name = 'account_copy';
SET @table_name = 'account';
SET @primary_key = 'id';

DROP TRIGGER IF EXISTS `@trigger_name`;

DELIMITER $$

CREATE TRIGGER `@trigger_name` AFTER INSERT
    ON `@table_name`
FOR EACH ROW BEGIN
    INSERT INTO `@target_bdd`.`@table_name`
    SELECT * FROM `@table_name` 
    WHERE `@primary_key` = NEW.`@primary_key`; 
END $$
DELIMITER ;

但是我遇到了以下错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that 
corresponds >to your MySQL server version for the right syntax to use near '@table_name
FOR EACH ROW BEGIN INSERT INTO `@target_bdd`.`@table_name` SELECT * ' at line 2

为什么?我试过其他引号('“),但是还是有同样的错误:(
没有引号:
ERROR 1064(42000):您的SQL语法中存在错误;请检查与您的MySQL服务器版本相对应的手册,以了解在@table_name上插入后触发器的正确语法为每行BEGIN INSERT INTO @target
我试图使用SQL指令声明一个用户定义变量,例如:
SET @sql = CONCAT(
    'CREATE TRIGGER ',
    @trigger_name,
    ' AFTER INSERT ON ',
    @table_name,
    ' FOR EACH ROW BEGIN INSERT INTO ',
    @target_bdd,
    '.',
    @table_name,
    ' SELECT * FROM ',
    @table_name, 
    ' WHERE ',
    @primary_key,
    ' = NEW.',
    @primary_key, 
    '; END'
    );

PREPARE stmt FROM @sql;
EXECUTE stmt;

但是我遇到了错误1295 (在MySQL文档中查看)

2个回答

1

在普通的SQL中,您不能使用用户变量作为表名、列名等。您也不能在预处理语句中创建触发器(就像错误提示的那样)。看起来目前没有办法实现您想要的功能。


0

我必须说,我以前从未使用过用户定义变量,但在测试中发现不应该对它们加引号!
当您对`@vars`加引号时,MySQL将寻找字面上的'@vars'字段,而不是其中存储的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接