there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT

Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause解決:

執行的建表語句:

CREATE TABLE `parameter` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '資源ID,自增主鍵',
  `parameter_key` varchar(64) NOT NULL COMMENT 'KEY值',
  `parameter_name` varchar(64) NOT NULL COMMENT '屬性NAME',
  `parameter_value` varchar(512) NOT NULL COMMENT 'VALUE值',
  `created_tm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `modify_tm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='parameter';


執行出錯,問題:
[Err] 1293 - Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

問題描述:

定義表的時候出現問題,是創建新表的時候出錯了。報錯的意思就是隻能有一個類型爲CURRENT_TIMESTAMP的列存在。`created_tm` timestamp 和  `modify_tm`都是TIMESTAMP類型。

原因:

使用的mysql版本是5.5的,5.5版本不支持在一個表裏存在2個TIMESTAMP 類型的列。如果有兩個TIMESTAMP 類型的列,當你給一個timestamp設置爲CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP的時候,其他的TIMESTAMP 字段需要顯式設定default值。

解決方案:

1.將自己的mysql版本升級到5.6以上。

2. 只給一個列設置TIMESTAMP 類型。

CREATE TABLE `parameter` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '資源ID,自增主鍵',
  `parameter_key` varchar(64) NOT NULL COMMENT 'KEY值',
  `parameter_name` varchar(64) NOT NULL COMMENT '屬性NAME',
  `parameter_value` varchar(512) NOT NULL COMMENT 'VALUE值',
  `created_tm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創建時間',
  `modify_tm` VARCHAR(14) NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='parameter';

3.除了第一個TIMESTAMP 類型的字段外,其他的TIMESTAMP 字段需要顯式設定default值。

CREATE TABLE `parameter` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '資源ID,自增主鍵',
  `parameter_key` varchar(64) NOT NULL COMMENT 'KEY值',
  `parameter_name` varchar(64) NOT NULL COMMENT '屬性NAME',
  `parameter_value` varchar(512) NOT NULL COMMENT 'VALUE值',
  `created_tm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創建時間',
  `modify_tm` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='parameter';
4.如果不是必須使用TIMESTAMP類型,可以使用 datetime
DROP TABLE IF EXISTS `parameter`;
CREATE TABLE `parameter` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '資源ID,自增主鍵',
  `parameter_key` varchar(64) NOT NULL COMMENT 'KEY值',
  `parameter_name` varchar(64) NOT NULL COMMENT '屬性NAME',
  `parameter_value` varchar(512) NOT NULL COMMENT 'VALUE值',
  `created_tm` datetime NOT NULL COMMENT '創建時間',
  `modify_tm` datetime NOT NULL COMMENT '修改時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='parameter';

拓展:TIMESTAMP  VS   datetime

datatime:

1. 佔用8個字節
2. 允許爲空值,可以自定義值,系統不會自動修改其值。

3. 實際格式儲存

4. 與時區無關

5. 不可以設定默認值,所以在不允許爲空值的情況下,必須手動指定datetime字段的值纔可以成功插入數據。
6. 可以在指定datetime字段的值的時候使用now()變量來自動插入系統的當前時間。
結論:datetime類型適合用來記錄數據的原始的創建時間,需要手動更新時間,否則datetime字段的值都不會改變。

timestamp:
1. 佔用4個字節
2. 允許爲空值,但是不可以自定義值,所以爲空值時沒有任何意義。
3. TIMESTAMP值不能早於1970或晚於2037。例如'1968-01-01',對於TIMESTAMP值卻無效,如果分配對象,時間將被轉換爲0。

4.值以UTC格式保存。(YYYYMMDD T HHMMSS Z(或者時區標識)。例如,20100607T152000Z,表示2010年6月7號15點20分0秒,Z表示是標準時間,如果表示北京時間,那麼就是:20100607T152000+08,其中 “+08” 表示東八區。

5.時區轉化 ,存儲時對當前的時區進行轉換,檢索時再轉換回當前的時區。

6. 默認值爲CURRENT_TIMESTAMP(),即當前的系統時間。
7. 數據庫會自動修改其值,所以在插入記錄時不需要指定timestamp字段的名稱和timestamp字段的值,你只需要在設計表的時候添加一個timestamp字段即可,插入後該字段的值會自動變爲當前系統時間。
8. 以後任何時間修改表中的記錄時,對應記錄的timestamp值會自動被更新爲當前的系統時間。
結論:timestamp類型適合用來記錄數據的最後修改時間,因爲只要你更改了記錄中其他字段的值,timestamp字段的值都會被自動更新。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章