我試圖創建一個動態的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 - ÿ你的SQL語法有錯誤;檢查與您的MySQL服務器版本對應的手冊,以找到在';'附近使用的正確語法。 PREPARE語句FROM 'ALTER TABLE
redinfomanager
CHANGEUnterkategorie
`Unte' 在行1
我怎麼能這樣做呢?
這是一個什麼錯誤立場?
從觸發運行'ALTER TABLE'命令可能是真的* *糟糕的主意 - 'ALTER TABLE'鎖定表,並且往往最終不得不重寫整個表,這可能是一個非常緩慢如果表格很大,則進行操作。如果你有一個沒有定義好的可能值的列,不要使用ENUM()。改用'VARCHAR'或類似的。 – duskwuff
好吧,桌子根本不算太大。該集合根本不可能改變,但現在我處於測試階段,所以我沒有時間手動編輯所有更改,因爲我可能會更改集以查看會發生什麼。 但是有沒有辦法讓這個工作? – BrainStone
請勿使用'ENUM'。適當大小的「VARCHAR」列的行爲幾乎完全相同,並且允許您在不修改表的情況下使用任何字符串值。 – duskwuff