2013-03-13 226 views
18

如何在MySQL中的字段另一列設置默認值我已經做到了與虛擬領域的Oracle,但我不知道該怎麼做在MySQL,這是我的表:mysql的設置字段默認值其他列

create table TSM_TRANSACTION_TBL 
(
    TRANS_ID  INT primary key auto_increment, 
    LOCATION_ID INT, 
    TRANS_DATE DATE, 
    RESOURCE_ID INT, 
    TS_ID  INT, 
    MAX_VALUE INT, 
    BOOKED_UNITS INT default 0, 
    REMAINING INT default MAX_VALUE - BOOKED_UNITS, 
    BOOKED  INT not null, 
    USER_ID  INT, 
    TRANS_TIME TIMESTAMP 
) 
+1

可能重複:http://stackoverflow.com/questions/6377977/mysql-default-value-as-other-fields-value – 2013-03-13 11:52:57

回答

18
作爲

Data Type Default Values記載:

在數據類型說明書中的DEFAULT value子句表示爲列的默認值。有一個例外,默認值必須是常數;它不能是一個函數或表達式。這意味着,例如,您不能將日期列的默認值設置爲函數的值,如NOW()CURRENT_DATE。例外情況是,您可以指定CURRENT_TIMESTAMP作爲TIMESTAMP列的默認值。見Section 11.3.5, 「Automatic Initialization and Updating for TIMESTAMP

相反,可以定義一個插入觸發:

CREATE TRIGGER foo AFTER INSERT ON TSM_TRANSACTION_TBL FOR EACH ROW 
    IF NEW.REMAINING IS NULL THEN 
    SET NEW.REMAINING := NEW.MAX_VALUE - NEW.BOOKED_UNITS; 
    END IF;; 
+5

我用你的代碼,但它告訴我,我不能用新插入後,我改變它之前,它是完美的工作 – BMW 2013-03-13 13:18:29

14

'新' 是不能接受的後插入觸發器。您應該通過BEFORE插入觸發器進行'現場更新'。所以,

CREATE TRIGGER foo BEFORE INSERT ON TSM_TRANSACTION_TBL FOR EACH ROW 
    IF NEW.REMAINING IS NULL THEN 
     SET NEW.REMAINING := NEW.MAX_VALUE - NEW.BOOKED_UNITS; 
    END IF;;