MySQL目前不支持列的Default 为函数的形式
如达到你某列的默认值为当前更新日期与时间的功能
你可以使用TIMESTAMP列类型
下面就详细说明TIMESTAMP列类型
TIMESTAMP列类型
TIMESTAMP值可以从的某时的开始一直到年精度为一秒其值作为数字显示
TIMESTAMP值显示尺寸的格式如下表所示
+++
| 列类型| 显示格式 |
| TIMESTAMP() | YYYYMMDDHHMMSS |
| TIMESTAMP() | YYMMDDHHMMSS |
| TIMESTAMP() | YYMMDDHHMM |
| TIMESTAMP()| YYYYMMDD |
| TIMESTAMP()| YYMMDD |
| TIMESTAMP()| YYMM |
| TIMESTAMP()| YY |
+++
完整TIMESTAMP格式是位但TIMESTAMP列也可以用更短的显示尺寸创造
最常见的显示尺寸是和
你可以在创建表时指定一个任意的显示尺寸但是定义列长为或比大均会被强制定义为列长
列长在从~范围的奇数值尺寸均被强制为下一个更大的偶数
列如
定义字段长度 强制字段长度
TIMESTAMP() >TIMESTAMP()
TIMESTAMP()>TIMESTAMP()
TIMESTAMP() >TIMESTAMP()
TIMESTAMP() >TIMESTAMP()
所有的TIMESTAMP列都有同样的存储大小
使用被指定的时期时间值的完整精度(位)存储合法的值不考虑显示尺寸
不合法的日期将会被强制为存储
这有几个含意
虽然你建表时定义了列TIMESTAMP()但在你进行数据插入与更新时TIMESTAMP列实际上保存了位的数据(包括年月日时分秒)只不过在你进行查询时MySQL返回给你的是位的年月日数据如果你使用ALTER TABLE拓宽一个狭窄的TIMESTAMP列以前被隐蔽的信息将被显示
同样缩小一个TIMESTAMP列不会导致信息失去除了感觉上值在显示时较少的信息被显示出
尽管TIMESTAMP值被存储为完整精度直接操作存储值的唯一函数是UNIX_TIMESTAMP()由于MySQL返回TIMESTAMP列的列值是进过格式化后的检索的值这意味着你可能不能使用某些函数来操作TIMESTAMP列(例如HOUR()或SECOND())除非TIMESTAMP值的相关部分被包含在格式化的值中例如一个TIMESTAMP列只有被定义为TIMESTAMP()以上时TIMESTAMP列的HH部分才会被显示因此在更短的TIMESTAMP值上使用HOUR()会产生一个不可预知的结果
不合法TIMESTAMP值被变换到适当类型的零值()(DATETIMEDATE亦然)
你可以使用下列语句来验证
CREATE TABLE test (id INT () UNSIGNED AUTO_INCREMENT date TIMESTAMP () PRIMARY KEY(id));
INSERT INTO test SET id = ;
SELECT * FROM test;
+++
| id | date|
+++
| | |
+++
ALTER TABLE test CHANGE date date TIMESTAMP();
SELECT * FROM test;
+++
| id | date|
+++
| | |
+++
你可以使用TIMESTAMP列类型自动地用当前的日期和时间标记INSERT或UPDATE的操作
如果你有多个TIMESTAMP列只有第一个自动更新
自动更新第一个TIMESTAMP列在下列任何条件下发生
列值没有明确地在一个INSERT或LOAD DATA INFILE语句中指定
列值没有明确地在一个UPDATE语句中指定且另外一些的列改变值(注意一个UPDATE设置一个列为它已经有的值这将不引起TIMESTAMP列被更新因为如果你设置一个列为它当前的值MySQL为了效率而忽略更改)
你明确地设定TIMESTAMP列为NULL
除第一个以外的TIMESTAMP列也可以设置到当前的日期和时间只要将列设为NULL或NOW()
CREATE TABLE test (
id INT () UNSIGNED AUTO_INCREMENT
date TIMESTAMP ()
date TIMESTAMP ()
PRIMARY KEY(id)
);
INSERT INTO test (id date date) VALUES ( NULL NULL);
INSERT INTO test SET id= ;
++++
| id | date| date|
++++
| | | |
| | | |
++++
>第一条指令因设datedate为NULL所以datedate值均为当前时间
第二条指令因没有设datedate列值第一个TIMESTAMP列date为更新为当前时间
而二个TIMESTAMP列date因日期不合法而变为
UPDATE test SET id= WHERE id=;
++++
| id | date| date|
++++
| | | |
| | | |
++++
>这条指令没有明确地设定date的列值所以第一个TIMESTAMP列date将被更新为当前时间
UPDATE test SET id= date=datedate=NOW() WHERE id=;
++++
| id | date| date|
++++
| | | |
| | | |
++++
>这条指令因设定date=date所以在更新数据时date列值并不会发生改变
而因设定date=NOW()所以在更新数据时date列值会被更新为当前时间
此指令等效为 UPDATE test SET id= date=datedate=NULL WHERE id=;
因MySQL返回的 TIMESTAMP 列为数字显示形式
你可以用DATE_FROMAT()函数来格式化 TIMESTAMP 列
SELECT idDATE_FORMAT(date%Y%m%d %H:%i:%s) As date
DATE_FORMAT(date%Y%m%d %H:%i:%s) As date FROM test;
++++
| id | date | date |
++++
| | :: | :: |
| | :: | :: |
++++
SELECT idDATE_FORMAT(date%Y%m%d) As date
DATE_FORMAT(date%Y%m%d) As date FROM test;
++++
| id | date | date |
++++
| | | |
| | | |
++++
在某种程度上你可以把一种日期类型的值赋给一个不同的日期类型的对象
然而而尤其注意的是值有可能发生一些改变或信息的损失
如果你将一个DATE值赋给一个DATETIME或TIMESTAMP对象结果值的时间部分被设置为::因为DATE值中不包含有时间信息
如果你将一个DATETIME或TIMESTAMP值赋给一个DATE对象结果值的时间部分被删除因为DATE类型不存储时间信息
尽管DATETIME DATE和TIMESTAMP值全都可以用同样的格式集来指定
但所有类型不都有同样的值范围
例如TIMESTAMP值不能比早也不能比晚
这意味着一个日期例如当作为一个DATETIME或DATE值时它是合法的
但它不是一个正确TIMESTAMP值!并且如果将这样的一个对象赋值给TIMESTAMP列它将被变换为
当指定日期值时当心某些缺陷
允许作为字符串指定值的宽松格式能被欺骗例如因为:分隔符的使用值::可能看起来像时间值但是如果在一个日期中使用上下文将作为年份被解释成值::将被变换到因为不是一个合法的月份
以位数字指定的年值是模糊的因为世纪是未知的MySQL使用下列规则解释位年值 在范围的年值被变换到 在范围的年值被变换到