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類型,可以使用 datetimeDROP 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:
3. 實際格式儲存
4. 與時區無關
5. 不可以設定默認值,所以在不允許爲空值的情況下,必須手動指定datetime字段的值纔可以成功插入數據。1. 佔用4個字節
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(),即當前的系統時間。