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 服务器版本相对应的手册,以在第 1 行的 '@trigger_name AFTER INSERT ON @table_name FOR EACH ROW 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 文档

4

2 回答 2

1

您不能在普通 SQL 中将用户变量用于表名、列等。您也不能在准备好的语句中创建触发器(就像错误告诉您的那样)。似乎目前没有办法做你想做的事。

于 2011-07-26T11:27:52.473 回答
0

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

于 2011-07-26T08:39:24.830 回答