我正在嘗試這樣做,但似乎MySQL不允許我。有沒有這個問題的解決方案,或者我希望在我的INSERT查詢中始終包含該函數?是否可以在MySQL中創建一個具有UNIX_TIMESTAMP默認值的列?
CREATE TABLE foo(
created INT NOT NULL DEFAULT UNIX_TIMESTAMP()
)
我知道,接受默認CURRENT_TIMESTAMP的TIMESTAMP類型的,但我的客戶堅持使用劃時代的時間在數據庫中。
我正在嘗試這樣做,但似乎MySQL不允許我。有沒有這個問題的解決方案,或者我希望在我的INSERT查詢中始終包含該函數?是否可以在MySQL中創建一個具有UNIX_TIMESTAMP默認值的列?
CREATE TABLE foo(
created INT NOT NULL DEFAULT UNIX_TIMESTAMP()
)
我知道,接受默認CURRENT_TIMESTAMP的TIMESTAMP類型的,但我的客戶堅持使用劃時代的時間在數據庫中。
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)
那麼,如果MySQL不會讓你直接做,你可以使用BEFORE INSERT... FOR EACH ROW
trigger做到這一點。
有一個例外,默認值 必須是一個常數;它不能是一個 函數或表達式。這意味着,例如, 例如,您不能將日期列的默認值設置爲 ,例如NOW()或 CURRENT_DATE。例外是 您可以指定CURRENT_TIMESTAMP爲 TIMESTAMP列的默認值。
您可以爲此創建觸發器。
在這種情況下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
請到通過這些鏈接
性能想法
_tigers_? - 他們被馴服了,我希望:-) – kleopatra 2014-01-12 13:15:16
@kleopatra:D ... – 2014-01-12 13:21:58
+1的觸發方式。謝謝! – 2012-09-19 17:16:18
性能有差異,查詢TIMESTAMP還是BIGINT?它實際上是作爲一個字符串存儲的,還是被有效存儲? TNX。 – JRun 2014-03-30 06:12:46
任何選擇數據類型的人都應該記住TIMESTAMP面向的是2038,但是與INT相同。考慮存儲在UNSIGNED INT(11)中的UNIX_TIMESTAMP(Epoch)的原因是將溢出漏洞推到下一個世紀(BIGINT更進一步)。隨着新技術的出現,您的代碼很可能需要重寫。然而,2038年將會在我們許多有生之年發生。我們今天構建的數據庫在這一點上仍然可以作爲遺留系統。 @JRun - 我期望MySQL中的TIMESTAMP在後端被視爲INT,因爲它具有相同的數字限制。 – 2016-02-06 11:26:04