2011-03-16 94 views
23

我正在嘗試這樣做,但似乎MySQL不允許我。有沒有這個問題的解決方案,或者我希望在我的INSERT查詢中始終包含該函數?是否可以在MySQL中創建一個具有UNIX_TIMESTAMP默認值的列?

CREATE TABLE foo(
    created INT NOT NULL DEFAULT UNIX_TIMESTAMP() 
) 

我知道,接受默認CURRENT_TIMESTAMP的TIMESTAMP類型的,但我的客戶堅持使用劃時代的時間在數據庫中。

回答

36

MySQL實現TIMESTAMP數據類型的方式實際上是在數據庫中存儲曆元時間。所以,你可以只使用一個TIMESTAMP柱,以CURRENT_TIMESTAMP默認的,如果你想爲一個int顯示其應用的UNIX_TIMESTAMP()它:

CREATE TABLE foo(
    created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
); 

insert into foo values (current_Date()),(now()); 

select unix_timestamp(created) from foo; 
+-------------------------+ 
| unix_timestamp(created) | 
+-------------------------+ 
|    1300248000 | 
|    1300306959 | 
+-------------------------+ 
2 rows in set (0.00 sec) 

但是,如果你真的想要的列的數據類型爲INT ,您可以使用R. Bemrose的建議並通過觸發設置它:

CREATE TABLE foo(
    created INT NULL 
); 

delimiter $$ 

create trigger tr_b_ins_foo before insert on foo for each row 
begin 
    if (new.created is null) 
    then 
    set new.created = unix_timestamp(); 
    end if; 
end $$ 

delimiter ; 


insert into foo values (unix_timestamp(current_Date())), (null); 

select created from foo; 
+------------+ 
| created | 
+------------+ 
| 1300248000 | 
| 1300306995 | 
+------------+ 
2 rows in set (0.00 sec) 
+0

+1的觸發方式。謝謝! – 2012-09-19 17:16:18

+1

性能有差異,查詢TIMESTAMP還是BIGINT?它實際上是作爲一個字符串存儲的,還是被有效存儲? TNX。 – JRun 2014-03-30 06:12:46

+1

任何選擇數據類型的人都應該記住TIMESTAMP面向的是2038,但是與INT相同。考慮存儲在UNSIGNED INT(11)中的UNIX_TIMESTAMP(Epoch)的原因是將溢出漏洞推到下一個世紀(BIGINT更進一步)。隨着新技術的出現,您的代碼很可能需要重寫。然而,2038年將會在我們許多有生之年發生。我們今天構建的數據庫在這一點上仍然可以作爲遺留系統。 @JRun - 我期望MySQL中的TIMESTAMP在後端被視爲INT,因爲它具有相同的數字限制。 – 2016-02-06 11:26:04

17

the documentation

有一個例外,默認值 必須是一個常數;它不能是一個 函數或表達式。這意味着,例如, 例如,您不能將日期列的默認值設置爲 ,例如NOW()或 CURRENT_DATE。例外是 您可以指定CURRENT_TIMESTAMP爲 TIMESTAMP列的默認值。

3

您可以爲此創建觸發器。

在這種情況下01 用於插入

  • 查詢

CREATE TRIGGER {trigger_name} BEFORE INSERT ON {table_name} FOR EACH ROW SET new.{field_name} = UNIX_TIMESTAMP(NOW());

CREATE TRIGGER my_trigger_name_1 BEFORE INSERT ON foo FOR EACH ROW SET new.created = UNIX_TIMESTAMP(NOW());

用於更新

  • 查詢

CREATE TRIGGER {trigger_name} BEFORE UPDATE ON {table_name} FOR EACH ROW SET new.{field_name} = UNIX_TIMESTAMP(NOW());

  • 在這種情況下

CREATE TRIGGER my_trigger_name_2 BEFORE UPDATE ON foo FOR EACH ROW SET new.created = UNIX_TIMESTAMP(NOW());

注:我不知道MYSQL TRIGGER

請到通過這些鏈接

性能想法
  1. Identify some of the drawback of implementing sql server triggers

  2. Using Triggers

+3

_tigers_? - 他們被馴服了,我希望:-) – kleopatra 2014-01-12 13:15:16

+0

@kleopatra:D ... – 2014-01-12 13:21:58

相關問題