2010-08-03 108 views
14

這似乎是一個非常簡單的,但我努力想出來。我想要列出數據庫中的一列,列出最初創建記錄的時間,以及另一列記錄何時更新記錄。這是我的理解,我應該能夠使用MySQL來做到這一切。所有的幫助表示讚賞:)'創建'和'更新'字段

這仍然太臭沒有答案,原因我已經開始想念Ruby on Rails的...

+0

請你提出你的問題,我沒有找到任何明確的。 – nepsdotin 2010-08-03 04:19:08

+1

mdgrech希望添加兩個字段,其中包含表格行的創建時間和更新時間的時間戳。 – kiamlaluno 2010-08-03 04:23:46

+6

+1對我來說似乎很清楚 – 2010-08-03 04:24:05

回答

7

您可能需要使用Datetime數據類型的組合和Timestamp數據類型。我會將我的created列設置爲DateTime,其中DEFAULT NOW()和我的updated列爲Timestamp,其中DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP屬性。

這裏是爲Timestamp DT文檔:

與這兩個:

http://dev.mysql.com/doc/refman/5.0/en/timestamp.html

在CREATE TABLE語句中,第一個TIMESTAMP列可以在以下任何一種方式聲明DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句,該列具有其默認值的當前時間戳,並自動更新。

既不使用DEFAULT也不使用ON UPDATE子句,它與DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP相同。

使用DEFAULT CURRENT_TIMESTAMP子句並且沒有ON UPDATE子句,該列具有默認值的當前時間戳記,但不會自動更新。

沒有DEFAULT子句和ON UPDATE CURRENT_TIMESTAMP子句,該列的默認值爲0,並自動更新。

具有固定的DEFAULT值,該列具有給定的默認值,並且不會自動初始化爲當前時間戳。如果該列也有一個ON UPDATE CURRENT_TIMESTAMP子句,它會自動更新;否則,它具有固定的默認值,不會自動更新。

+1

從我所知道的你不能同時使用兩個...如果你有一個DEFAULT CURRENT_TIMESTAMP的字段,你不能有一個ON UPDATE CURRENT_TIMESTAMP事件。 '#1293 - 表格定義不正確;在DEFAULT或ON UPDATE子句中只能有一個TIMESTAMP列' – Prix 2010-08-03 04:25:40

+0

您是對的,正在編輯答案... – 2010-08-03 04:28:00

+0

+1:正確的方法 - 添加兩列並適當地設置DEFAULT約束。 – 2010-08-03 04:35:48

0

如果您不能使用具有Paul W建議的默認屬性的時間戳字段,則可以使用AFTER INSERT和AFTER UPDATE觸發器來填充字段。

+0

他只能使用1時間戳字段,將自動使用MySQL填充自己,第二將需要由PHP填充。 – Prix 2010-08-03 16:52:34

0

您需要兩個字段「創建」和 「更新」與類型的日期時間。當插入 新條目,然後用當前時間戳插入 「已創建」。 當更新發生時,用當前時間戳 插入 「更新」,並且讓「創建」字段保持爲 。

對於當前時間戳,您可以在您的mysql查詢中使用 NOW()。

1

爲了完成你的問題和其他人查看這個問題,這裏是答案。注意這是爲MySQL 5.x編寫的。

DROP TABLE IF EXISTS `test1`; 
CREATE TABLE `test1` (
    `id` INT NULL AUTO_INCREMENT , 
    `name` varchar(50) NOT NULL , 
    `created` DATETIME , 
    `updated` DATETIME , 
    PRIMARY KEY (`id`), 
    INDEX (`name`) 
); 

DELIMITER $$ 
DROP TRIGGER IF EXISTS `test1_created`$$ 
CREATE TRIGGER `test1_created` BEFORE INSERT ON `test1` 
    FOR EACH ROW BEGIN 
     SET NEW.`created` = UTC_TIMESTAMP(); 
     SET NEW.`updated` = UTC_TIMESTAMP(); 
    END; 
$$ 
DROP TRIGGER IF EXISTS `test1_updated`$$ 
CREATE TRIGGER `test1_updated` BEFORE UPDATE ON `test1` 
    FOR EACH ROW BEGIN 
     SET NEW.`updated` = UTC_TIMESTAMP(); 
    END; 
$$ 
DELIMITER ; 

注意

您可以使用時間戳,updated列這將自動更新,因此不需要在BEFORE UPDATE觸發器的價值,但時間戳記從1970年至2038這即將來臨我喜歡想我的應用程序將永遠活着:)。儘管TIMESTAMP僅爲4字節,而DATETIME爲8字節。

TIMESTAMP range '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC

DATETIME range '1000-01-01 00:00:00' to '9999-12-31 23:59:59'

0

從MySQL 5.0中認證指南:

CREATE TABLE ts_test5 (
    created TIMESTAMP DEFAULT 0, 
    updated TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    data CHAR(30) 
); 

要控制TIMESTAMP列的初始化和更新行爲,可以添加一個或兩個的默認CURRENT_TIMESTAMP和ON將CURRENT_TIMESTAMP屬性更新爲使用CREATE TABLE創建表時的列定義... 和 ......如果你沒有指定的DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP屬性創建表時,MySQL的自動分配兩者的第一個TIMESTAMP列

而且

你不能使用DEFAULT CURRENT_TIMESTAMP與一列和ON UPDATE CURRENT_TIMESTAMP與另一

+0

另外,即使您以這種方式設置了一個表格,然後從phpMyAdmin插入了一個新行,並且您未指定current_timestamp函數,則時間將爲零時間戳。您需要在從phpMyAdmin添加行時指定current_timestamp。但是,SQL插入和更新將按預期工作。 – 2015-02-27 12:58:16