2014-03-04 103 views
7

我最近決定停止在我的表中爲我的createdmodified日期字段使用MySQL觸發器,因爲在客戶端部署中運行安裝文件中包含的腳本時會出現複雜情況。MySQL時間戳字段 - 創建/修改

我已經改變了的字段是這樣的:(例子)

alter table users 
modify `created` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' 

alter table users 
modify `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
     ON UPDATE CURRENT_TIMESTAMP 

當我現在運行了一個程序,填寫表格中添加數據(表單控件數據綁定),我得到的消息「列創建'不允許空值「。

在已經存在的數據上,當我嘗試更新時,修改日期根本不會改變。

我看了很多文章,如Having both a Created and Last Updated timestamp columns in MySQL 4.0,但找不到解決方案。

我該如何解決這個問題?

我使用的是MySQL v 5.6.15.0

回答

0

根據不同的驅動程序,0000-00-00日期可能被視爲無效,這不是有效的爲您列定義。但如果不是這樣,1970年之前的任何日期也不是有效的時間戳。

我想嘗試界定 「創造」 爲DATETIME,而不是TIMESTAMP

alter table users modify `created` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00' 

(這是一個DATETIME可以接受的最低日期)。至於爲什麼修改後的列不起作用,這是同樣問題的一部分。表應該有只有一個時間戳列,但如果你把兩個或更多,只有第一個可以有CURRENT_TIMESTAMP。愚蠢的MySQL限制。

這個限制將在未來的版本中解除,但我想你的還沒有。

+0

感謝您的答覆。我使用的版本是Visual Studio開發的最新版本。如您所述,我已經改變了創建的字段。不幸的是,我仍然遇到同樣的問題。它可能是我使用的C#數據集? –

2

變化

alter table users modify 
    `created` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' 

要:

alter table users modify 
    `created` TIMESTAMP NOT NULL DEFAULT now() 

或者:

​​
4
ALTER TABLE 'my_table' 
CHANGE `created` TIMESTAMP DEFAULT 0, 
CHANGE `modified` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 

但一定要在 'ADDED_DATE' 欄明確設置爲NULL在插入數據

下面是一個例子:

mysql> CREATE TABLE ts_test5 (
-> created TIMESTAMP DEFAULT 0, 
-> updated TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
-> data CHAR(30) 
->); 
Query OK, 0 rows affected (0.01 sec) 

mysql> INSERT INTO ts_test5 (created, data) 
-> VALUES (NULL, ‘original_value’); 
Query OK, 1 row affected (0.00 sec) 

mysql> SELECT * FROM ts_test5; 
+---------------------+---------------------+----------------+ 
| created    |updated    |data   | 
+---------------------+---------------------+----------------+ 
| 2005-01-04 14:47:39 | 0000-00-00 00:00:00 | original_value | 
+---------------------+---------------------+----------------+ 
1 row in set (0.00 sec) 

mysql> . . . time passes . . . 

mysql> UPDATE ts_test5 SET data=’updated_value’; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 
Changed: 1 
Warnings: 0 

mysql> SELECT * FROM ts_test5; 
+---------------------+---------------------+---------------+ 
| created    |updated    |data   | 
+---------------------+---------------------+---------------+ 
| 2005-01-04 14:47:39 | 2005-01-04 14:47:52 | updated_value | 
+---------------------+---------------------+---------------+ 
1 row in set (0.00 sec) 
+0

感謝您的回覆。我正在使用數據集來添加/更新我的數據,而不是查詢。例如this.usersTableAdapter.Update(this.payrollDataSet.users); this.payrollDataSet.users.AcceptChanges(); –