时间戳timestamp类型
Timestamp
Mysql中timestamp的格式为”YYYY-MM-DD:HH-MM-SS”,显示宽度是19个字符,如果你在insert的时候指定(null),那么它会自动显示为当前操作的时间。但是如果你在insert操作的时候没有插入数据,那么默认为0000-00-00 00-00-00,TIMESTAMP 类型使用 4 个字节,范围是 ‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.’ 。
mysql> insert into test values(null); Query OK, 1 row affected mysql> select * from test; +---------------------+ | time | +---------------------+ | 2018-12-27 12:31:36 | +---------------------+ 1 row in set
当你每次insert和update操作的时候,会自动记录当前操作的时间。如果你不想要时间这个格式,可以将其转换为数字具体操作为select的时候在列的名字后面添加+0
mysql> update test set name='王五' where id=1; Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from test; +---------------------+----+------+------+ | time | id | name | eee | +---------------------+----+------+------+ | 2018-12-27 12:50:37 | 1 | 王五 | NULL | | 2018-12-27 12:32:04 | 2 | | NULL | | 2018-12-27 12:44:59 | 3 | 张三 | NULL | | 2018-12-27 12:44:59 | 4 | 李四 | NULL | +---------------------+----+------+------+ //数字转换 mysql> select time+0 from test; +----------------+ | time+0 | +----------------+ | 136 | | 204 | +----------------+ 2 rows in set
如果定义时 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 子句都有,列值为默认使用当前的时间戳,并且自动更新
CREATE TABLE tb1( id INTEGER, t1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); mysql> DESC tb1; +-------+-----------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------+------+-----+-------------------+-----------------------------+ | id | int(11) | YES | | NULL | | | t1 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +-------+-----------+------+-----+-------------------+-----------------------------+ 2 rows in set (0.00 sec) mysql> INSERT INTO tb1(id) values(1); Query OK, 1 row affected (0.10 sec) mysql> select * from tb1; +------+---------------------+ | id | t1 | +------+---------------------+ | 1 | 2017-08-30 12:07:00 | +------+---------------------+ 1 row in set (0.00 sec) mysql> UPDATE tb1 SET id=2 WHERE id=1; Query OK, 1 row affected (0.20 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from tb1; +------+---------------------+ | id | t1 | +------+---------------------+ | 2 | 2017-08-30 12:07:55 | +------+---------------------+ 1 row in set (0.00 sec)
如果不使用 DEFAULT 或 ON UPDATE 子句,那么它等同于 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
CREATE TABLE tb2( id INTEGER, t1 TIMESTAMP ); mysql> DESC tb2; +-------+-----------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------+------+-----+-------------------+-----------------------------+ | id | int(11) | YES | | NULL | | | t1 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +-------+-----------+------+-----+-------------------+-----------------------------+ 2 rows in set (0.00 sec)
如果只有 DEFAULT CURRENT_TIMESTAMP 子句,而没有 ON UPDATE 子句,列值默认为当前时间戳但不自动更新
CREATE TABLE tb3( id INTEGER, t1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); mysql> DESC tb3; +-------+-----------+------+-----+-------------------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------+------+-----+-------------------+-------+ | id | int(11) | YES | | NULL | | | t1 | timestamp | NO | | CURRENT_TIMESTAMP | | +-------+-----------+------+-----+-------------------+-------+
注意:当你在需要在表中添加类型为timestamp列的时候,如果你没有指定default current_timestamp on update current_timstamp的时候,这时这个列的默认值是0000-00-00 00-00-00;
mysql> alter table test add t timestamp; Query OK, 0 rows affected Records: 0 Duplicates: 0 Warnings: 0 mysql> desc test; +-------+------------+------+-----+---------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------------------+-----------------------------+ | t | timestamp | NO | | 0000-00-00 00:00:00 | | +-------+------------+------+-----+---------------------+-----------------------------+
总结:
- 占用4个字节
- 允许为空值,但是不可以自定义值,所以为空值时没有任何意义。
- TIMESTAMP值不能早于1970或晚于2037。这说明一个日期,例如’1968-01-01’,虽然对于DATETIME或DATE值是有效的,但对于TIMESTAMP值却无效,如果分配给这样一个对象将被转换为0。
- 默认值为CURRENT_TIMESTAMP(),其实也就是当前的系统时间。
- 数据库会自动修改其值,所以在插入记录时不需要指定timestamp字段的名称和timestamp字段的值,你只需要在设计表的时候添加一个timestamp字段即可,插入后该字段的值会自动变为当前系统时间。
- 默认情况下以后任何时间修改表中的记录时,对应记录的timestamp值会自动被更新为当前的系统时间。
- 如果需要可以设置timestamp不自动更新。通过设置DEFAULT CURRENT_TIMESTAMP 可以实现。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219647.html原文链接:https://javaforall.net
