MySQL记录
前几天差点搞出来一个大飞机,项目开发使用的MySQL数据库,其中有一张表使用的数据类型为timestamp日期类型,本来用的好好的,在测试的时候出现了一个BUG。
demo
如下面的SQL语句:
CREATE TABLE USER(
user_id VARCHAR(10),
user_name VARCHAR(20),
birthday TIMESTAMP,
create_time TIMESTAMP,
modify_time TIMESTAMP
)
看起来好好的吧,但是当执行插入数据操作的时候,如:
INSERT INTO USER(user_id)
VALUES('u001');
得到的结果是:
看到没有?我没有赋值啊,但是数据库默认给我添加了一个当前日期的值,这样不行啊!
自动赋值条件
下面是在百度搜索到的有关自动更新信息:
你可以使用TIMESTAMP列类型自动地用当前的日期和时间标记INSERT或UPDATE的操作。
如果你有多个TIMESTAMP列,只有第一个自动更新。
自动更新第一个TIMESTAMP列在下列任何条件下发生:
1、列值没有明确地在一个INSERT或LOAD DATA INFILE语句中指定。
2、列值没有明确地在一个UPDATE语句中指定且另外一些的列改变值。
(注意一个UPDATE设置一个列为它已经有的值, 这将不引起TIMESTAMP列被更新, 因为如果你设置一个列为它当前的值,MySQL为了效率而忽略更改。)
3、你明确地设定TIMESTAMP列为NULL.
4、除第一个以外的TIMESTAMP列也可以设置到当前的日期和时间,只要将列设为NULL,或NOW()
验证
1.insert的时候,在上面的demo已经被验证。
2.update的时候,执行SQL之前
执行
UPDATE USER
SET user_name = '更新'
WHERE user_id = 'u001';
结果:
可以看到时间从00:04变成00:06,时间自动更新了。
3,设置为null的时候。
INSERT INTO USER(user_id,birthday)
VALUES('u003',NULL);
4.其他列测试
INSERT INTO USER(user_id,birthday,create_time,modify_time)
VALUES('u004',NULL,NULL,NOW());
疑问
我查询到有的说,timestamp只能设置一个列默认值,因为数据库认为数据重复了,所以不需要重复添加,所以除了第一个timestamp可以设置默认的当前值,后面的都不能设置,当时我测试是可以的。
CREATE TABLE USER(
user_id VARCHAR(10),
user_name VARCHAR(20),
birthday TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
modify_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
这句SQL是可以执行通过的,结果:
数据库表结构查看:
我的MySQL版本:
*注:建议使用datatime类型