Используйте пользовательскую переменную в предложении INSERT ON - PullRequest
4 голосов
/ 26 июля 2011

Я пытаюсь сделать чистый триггер с пользовательскими переменными, поэтому это мой код:


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

Почему? Я пытался с другими кавычками ('"), но есть та же ошибка: (

Без кавычек:

ОШИБКА 1064 (42000): у вас ошибка в синтаксисе SQL; проверить руководство, которое соответствует вашей версии сервера MySQL для права синтаксис для использования рядом с @trigger_name ПОСЛЕ ВСТАВКИ НА @table_name ДЛЯ КАЖДОГО ROW НАЧАЛО ВСТАВИТЬ В @target 'в строке 1

Я пытаюсь объявить пользовательскую переменную с инструкциями 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 голос
/ 26 июля 2011

Нельзя использовать пользовательские переменные для имен таблиц, столбцов и т. Д. В простом SQL.Вы не можете также создать триггер в подготовленном операторе (как и говорилось в сообщении об ошибке).Похоже, в настоящее время нет способа делать то, что вы хотите.

0 голосов
/ 26 июля 2011

Должен сказать, что раньше я никогда не использовал пользовательские переменные, но при тестировании я обнаружил, что вам не следует их заключать в кавычки!
Когда вы заключаете в кавычки `mysql` @ vars` будет искать буквальное поле '@vars' вместо значения, которое хранится в нем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...