2011-04-28 142 views
1

我有一個名爲customer的表,其中有一個名爲name的列和一個名爲first_name_start的列。我想first_name_start等於SUBSTRING(name, 1, 4)。我將如何創建一個確保這種情況發生的觸發器?如何創建這個MySQL觸發器?

+0

你確定你需要做非規範化你的表嗎? – 2011-04-28 13:32:43

+0

你想讓這個觸發器觸發什麼條件?僅在插入時更新名稱字段?我們需要更多信息。 – 2011-04-28 13:34:15

+0

都插入並更新到'name'列。尼克,我確定。我希望我不必去規範化,但是我無法獲得我需要的其他性能。 (我檢查了) – 2011-04-28 13:36:03

回答

3
DELIMITER $$ 

CREATE TRIGGER trigger_name BEFORE INSERT ON your_table 
FOR EACH ROW 
BEGIN 
    SET NEW.first_name_start = SUBSTRING(NEW.name, 1, 4); 
END$$ 

CREATE TRIGGER trigger_name BEFORE UPDATE ON your_table 
FOR EACH ROW 
BEGIN 
    SET NEW.first_name_start = SUBSTRING(NEW.name, 1, 4); 
END$$ 

DELIMITER ; 

不幸的是,我沒有時間去測試它,它可能是完全錯誤的。

+1

這個工作 - 我剛剛測試了一個幾乎完全相同的東西,它只處理插入,但是OP沒有指定插入/更新/一切。 – Erik 2011-04-28 13:41:29

+0

@Erik:OP確實要求更新以便在評論中處理在他的問題上。 – 2011-04-28 13:46:27

0

如果你真的需要它作爲一個列,爲什麼不只是添加first_name_start視圖呢?那麼您將不會存儲冗餘數據,但您可以像使用它一樣使用它。

+0

這將是最合乎邏輯的事情,我希望我能做到,但它表現不佳。 – 2011-04-28 13:34:09

+0

有趣。你有沒有測試你的子字符串列的解決方案(填充沒有觸發器當然),並發現它很快?如果是這樣,那麼MySQL不能使「最合理」的解決方案表現良好,這有點不幸。 – 2011-04-28 13:38:44

+0

我只是做了我的查詢,並把一個'WHERE SUBSTRING(...',它是可笑的緩慢。 – 2011-04-28 13:42:56