2008-12-11 84 views
10

我有一張表,看起來有點像這個演員(forename,surname,stage_name);MySQL - 爲字段設置字符串連接函數的默認值

我想更新stage_name擁有的

forename." ".surname 

默認值,以便

insert into actors(forename, surname) values ('Stack', 'Overflow'); 

會產生記錄

'Stack'  'Overflow' 'Stack Overflow' 

這可能嗎?

謝謝:)

回答

14

MySQL不支持列定義的DEFAULT選項中的計算列或表達式。

您可以在觸發做到這一點(的MySQL 5.0或更高要求):

CREATE TRIGGER format_stage_name 
BEFORE INSERT ON actors 
FOR EACH ROW 
BEGIN 
    SET NEW.stage_name = CONCAT(NEW.forename, ' ', NEW.surname); 
END 

您可能還需要創建一個類似的觸發器BEFORE UPDATE

小心在forename和姓氏,因爲連接NULL與任何其他字符串連續產生NULL。根據需要在每列或連接字符串上使用COALESCE()

編輯:以下示例僅在NULL的情況下設置stage_name。否則,您可以在INSERT聲明中指定stage_name,並將其保留。

CREATE TRIGGER format_stage_name 
BEFORE INSERT ON actors 
FOR EACH ROW 
BEGIN 
    IF (NEW.stage_name IS NULL) THEN 
    SET NEW.stage_name = CONCAT(NEW.forename, ' ', NEW.surname); 
    END IF; 
END 
+0

我沒有使用MySQL,但是將這個始終覆蓋與級聯值的列?如果你想讓它作爲默認值,你應該可以覆蓋它,所以我認爲你也需要在NEW.stage_name上合併。 – 2008-12-11 19:26:02

+0

@ bill-karwin我在`NEW.aka = CONCAT(NEW.fname,',NEW.lname)``上得到了一個語法錯誤`...看到我的完整命令[** here pastebin **](http ://pastebin.com/FiEUBgcu)...任何指針?? – mOrloff 2012-10-17 21:08:25

2

我首先想到的是,如果你在其他領域有兩個值什麼是冗餘存儲他們在第三場的迫切需要?它面對正常化和效率飛行。

如果你只是想存儲連接的值,那麼你可以簡單地創建一個視圖(或IMSNHO甚至更好的存儲過程),將值連接成一個僞actor字段,並執行從視圖/ sproc而不是表直接。

如果你絕對必須存儲連接的值,你可以用兩種方式處理這個問題:

1)使用存儲過程來完成,而不是直接的SQL你的刀片。通過這種方式,您可以接收值併爲您希望填充的字段構造一個值,然後爲演員字段構建插入語句,包括連接值。

2)所以我不畫太多的火焰,用小孩的手套對待這個建議。僅作爲最後的手段使用。您可以通過添加一個觸發器來構建該值,如果該值爲null,則可以破解此行爲。一般觸發器不好。他們增加了看不見的成本和交互作用,進行相當簡單的交互。但是,您可以使用CREATE TRIGGER在插入或更新記錄後更新actors字段。以下是參考頁:

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html