Используйте пользовательскую переменную в предложении "INSERT ON"
Я пытаюсь сделать чистый триггер с пользовательскими переменными, так что это мой код:
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 ПОСЛЕ INSERT ON @table_name ДЛЯ КАЖДОЙ СТРОКИ НАЧАТЬ INSERT INTO @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 ответа
Вы не можете использовать пользовательские переменные для имен таблиц, столбцов и т. Д. В простом SQL. Вы не можете также создать триггер в подготовленном операторе (так же, как говорилось в сообщении об ошибке). Похоже, в настоящее время нет способа делать то, что вы хотите.
Должен сказать, что я никогда раньше не использовал определяемые пользователем переменные, но при тестировании я обнаружил, что вам не следует их заключать в кавычки!
Когда вы цитируете `@vars` mysql будет искать буквальное '@vars'
поле, вместо значения, которое хранится в нем.