2013-04-18 71 views
0

我試圖創建一個動態的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 CHANGE Unterkategorie`Unte' 在行1

我怎麼能這樣做呢?

這是一個什麼錯誤立場?

+0

從觸發運行'ALTER TABLE'命令可能是真的* *糟糕的主意 - 'ALTER TABLE'鎖定表,並且往往最終不得不重寫整個表,這可能是一個非常緩慢如果表格很大,則進行操作。如果你有一個沒有定義好的可能值的列,不要使用ENUM()。改用'VARCHAR'或類似的。 – duskwuff

+0

好吧,桌子根本不算太大。該集合根本不可能改變,但現在我處於測試階段,所以我沒有時間手動編輯所有更改,因爲我可能會更改集以查看會發生什麼。 但是有沒有辦法讓這個工作? – BrainStone

+1

請勿使用'ENUM'。適當大小的「VARCHAR」列的行爲幾乎完全相同,並且允許您在不修改表的情況下使用任何字符串值。 – duskwuff

回答

1

看來你在第一個表中的每個插入後第二個表改變ENUM價值?爲什麼不只是做一個foreign key constraint。這就要求你要放在表2中必須有從表1的值。這將是更有效的任何值,太:

只是一個例子(sqlfiddle link):

CREATE TABLE category (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    description VARCHAR(50) 
); 

CREATE TABLE thing (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    cat_id INTEGER, 
    description VARCHAR(50), 
    FOREIGN KEY (cat_id) REFERENCES category(id) 
); 

INSERT INTO category (description) 
VALUES 
    ('Category 1') 
    ,('Category 2'); 

INSERT INTO thing (cat_id, description) 
VALUES 
    (1, 'Thing 1') 
    ,(1, 'Thing 2') 
    ,(2, 'Thing 3'); 

INSERT INTO thing (cat_id, description) 
VALUES 
    (3, 'Imma Fail!') 

如果你運行它,第三次插入將失敗,因爲category表中沒有id

+0

它看起來像sqlfiddle鏈接是不一樣的我有什麼上面?它可能當你構建一個錯誤的模式不保存(這可能是更好的事':)')。但是,如果您複製並粘貼上述內容,則在嘗試構建模式時會出現以下錯誤:'模式創建失敗:無法添加或更新子行:外鍵約束失敗(''db_2_f1164''.''''thing' ',約束''thing_ibfk_1''外鍵(''cat_id'')參考''category''(''id'')):' – bhamby

+0

謝謝!這確實奏效!同時也感謝你教我一些全新的東西! – BrainStone

相關問題