我在表users中有两列,即registerDate and lastVisitDate,由datetime数据类型组成.我想做以下几点.

  1. 将registerDate默认值设置为MySQL NOW()
  2. 将lastVisitDate默认值设置为0000-00-00 00:00:00,而不是默认使用的null.

因为该表已经存在并且有现有记录,所以我想使用Modify table.我试过使用下面的两段代码,但两段都不起作用.

ALTER TABLE users MODIFY registerDate datetime DEFAULT NOW()
ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;

它给了我错误:ERROR 1067 (42000): Invalid default value for 'registerDate'

我可以在MySQL中将默认的datetime值设置为NOW()吗?

推荐答案

从MySQL 5.6.5开始,您可以使用带有动态默认值的DATETIME类型:

CREATE TABLE foo (
    creation_time      DATETIME DEFAULT   CURRENT_TIMESTAMP,
    modification_time  DATETIME ON UPDATE CURRENT_TIMESTAMP
)

甚至将这两条规则结合起来:

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Reference:
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html
http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html

在5.6.5之前,您需要使用TIMESTAMP数据类型,它会在记录被修改时自动更新.然而,不幸的是,每个表只能存在一个自动更新的TIMESTAMP字段.

CREATE TABLE mytable (
  mydate TIMESTAMP
)

见:http://dev.mysql.com/doc/refman/5.1/en/create-table.html

如果要防止MySQL更新UPDATE上的时间戳值(这样它只会在INSERT上触发),可以将定义更改为:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

Mysql相关问答推荐

MySQL 8.0.28覆盖(和函数)索引未使用

筛选器中的Case When语句

使用由其中一个表的列规定的条件连接两个表

将值代入子查询

如何跨多个产品查找相同时间范围的数据集

在停靠容器中备份和恢复MySQL数据库时出现Unicode字符问题

使用NOT EXISTS()时出现MySQL查询错误

MySQL中如何对字符串进行算术运算?

获取连续11天未考勤的员工

如何确保 SQL 记录的列不引用它自己的主键?

按相关表中的计数和特定值过滤

如何编写按天数汇总值的sql查询?

try 在 .map 中使用 Favorite 选项卡进行react .我无法更改 mysql 表上的布尔类型

使用 Having 表达式连接多个表

从多到多表中 Select 数据而无需重复

如何通过if语句对SQL查询进行排序

MySQL:如何多次加入同一张表?

MySQL使用多列 Select 重复记录

MySql 以秒为单位的两个时间戳之间的差异?

utf8mb4_unicode_ci 与 utf8mb4_bin