Я пытаюсь создать динамическую команду ALTER TABLE, но некоторая команда будет сгенерирована из запроса. Проблема в том, что я хочу использовать это в триггере!Использование запроса в ALTER TABLE в CREATE TRIGGER
Попытка 1:
ALTER TABLE `redinfomanager` CHANGE `Unterkategorie` `Unterkategorie` ENUM(("SELECT GROUP_CONCAT(CONCAT('\'', REPLACE(`Unterkategorien`, '\r\n', '\',\''), '\'') SEPARATOR ',') FROM `kategorien` GROUP BY '1'")) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL;
Попытка 2:
SELECT @tmp:=GROUP_CONCAT(CONCAT('\'', REPLACE(`Unterkategorien`, '\r\n', '\',\''), '\'') SEPARATOR ',') FROM `kategorien` GROUP BY '1';
SET @query=CONCAT('ALTER TABLE `redinfomanager` CHANGE `Unterkategorie` `Unterkategorie` ENUM(', @tmp, ') CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL');
PREPARE stmt FROM @query;
EXECUTE stmt;
Покушение 3:
SET @kat = (SELECT GROUP_CONCAT(CONCAT('\'', REPLACE(`Unterkategorien`, '\r\n', '\',\''), '\'') SEPARATOR ',') FROM kategorien GROUP BY '1');
PREPARE stmt FROM 'ALTER TABLE redinfomanager CHANGE Unterkategorie Unterkategorie ENUM(?) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL';
EXECUTE stmt USING @kat;
Он говорит мне:
1064 - Y ou имеет ошибку в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '; ГОТОВИТЬ STMT ОТ 'ALTER TABLE
redinfomanager
CHANGEUnterkategorie
`Unte' в строке 1
Как я могу это сделать?
И что это за ошибка?
Выполнение команды «ALTER TABLE» из триггера, вероятно, является «действительно» плохой идеей. «ALTER TABLE» блокирует таблицу и часто вынуждает переписывать всю таблицу, что может быть очень медленным если таблица большая. Если у вас есть столбец, который не имеет четко определенного набора возможных значений, не используйте 'ENUM()'. Вместо этого используйте 'VARCHAR' или подобное. – duskwuff
Ну, таблица не слишком большая. Набор вряд ли изменится вообще, но прямо сейчас я нахожусь на этапе тестирования, поэтому у меня нет времени на редактирование всех изменений вручную, так как я могу изменить набор, чтобы увидеть, что происходит. Но есть ли способ сделать эту работу ??? – BrainStone
Не используйте 'ENUM'. Столбец 'VARCHAR' соответствующего размера будет вести себя почти одинаково и позволит вам использовать любое строковое значение без изменения таблицы. – duskwuff