MySQL:TIMESTAMP 的默认值无效

Posted

技术标签:

【中文标题】MySQL:TIMESTAMP 的默认值无效【英文标题】:MySQL: Invalid default value for TIMESTAMP 【发布时间】:2018-01-05 07:08:59 【问题描述】:

我得到了错误

ERROR 1067 (42000) at line 5459: Invalid default value for 'start_time'

运行以下查询时

DROP TABLE IF EXISTS `slow_log`;
CREATE TABLE IF NOT EXISTS `slow_log` (
  `start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `user_host` mediumtext NOT NULL,
  `query_time` time(6) NOT NULL,
  `lock_time` time(6) NOT NULL,
  `rows_sent` int(11) NOT NULL,
  `rows_examined` int(11) NOT NULL,
  `db` varchar(512) NOT NULL,
  `last_insert_id` int(11) NOT NULL,
  `insert_id` int(11) NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `sql_text` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';

我使用的是 mysql 5.7.18

$ mysql --version
mysql  Ver 14.14 Distrib 5.7.18, for osx10.10 (x86_64) using  EditLine wrapper

根据MySQL 5.7 documentation,下面的语法是

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

上面的 SQL 语法有什么问题?

【问题讨论】:

不确定是否是问题所在,但您是否需要在 DEFAULT 中使用 NOT NULL?也尝试删除 (6)。 我同意,NOT NULL 可能是问题所在,因为在插入过程中,该字段最初为 null,以便在插入 current_timestamp 后更改。 怎么会得到像 int(10) 之类的东西!?! 【参考方案1】:

有趣的是,这两种方法都有效:

`start_time` timestamp(6), 

还有:

`start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

您可以使用后者——将精度说明符排除在定义之外。

但正确的方法是:

`start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),

如documentation中所述:

如果 TIMESTAMPDATETIME 列定义包含显式 任何地方的小数秒精度值,必须是相同的值 在整个列定义中使用。这是允许的:

CREATE TABLE t1 (
  ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)
);

这是不允许的:

CREATE TABLE t1 (
  ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(3)
);

【讨论】:

【参考方案2】:

试试:

mysql> DROP TABLE IF EXISTS `slow_log`;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `slow_log` (
    ->   `start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6)
    ->                                      ON UPDATE CURRENT_TIMESTAMP(6),
    ->   `user_host` mediumtext NOT NULL,
    ->   `query_time` time(6) NOT NULL,
    ->   `lock_time` time(6) NOT NULL,
    ->   `rows_sent` int NOT NULL,
    ->   `rows_examined` int NOT NULL,
    ->   `db` varchar(512) NOT NULL,
    ->   `last_insert_id` int NOT NULL,
    ->   `insert_id` int NOT NULL,
    ->   `server_id` int unsigned NOT NULL,
    ->   `sql_text` mediumtext NOT NULL
    -> ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';
Query OK, 0 rows affected (0.00 sec)

【讨论】:

以上是关于MySQL:TIMESTAMP 的默认值无效的主要内容,如果未能解决你的问题,请参考以下文章

mysql中Timestamp,time,datetime 区别??

Eloquent:带有时间戳的无效默认值

“添加日期”的默认值无效

MySQL timestamp的默认值怎么设置

MySQL TIMESTAMP 为默认 NULL,而不是 CURRENT_TIMESTAMP

mysql 中怎么设置默认值为系统日期