MySQL: TIMESTAMP 的默认值无效
MySQL: Invalid default value for TIMESTAMP
我收到错误
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 语法有什么问题?
尝试:
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)
有趣的是,这两个都有效:
`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 中所述:
If a TIMESTAMP
or DATETIME
column definition includes an explicit
fractional seconds precision value anywhere, the same value must be
used throughout the column definition. This is permitted:
CREATE TABLE t1 (
ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)
);
This is not permitted:
CREATE TABLE t1 (
ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(3)
);
我收到错误
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 语法有什么问题?
尝试:
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)
有趣的是,这两个都有效:
`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 中所述:
If a
TIMESTAMP
orDATETIME
column definition includes an explicit fractional seconds precision value anywhere, the same value must be used throughout the column definition. This is permitted:CREATE TABLE t1 ( ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) );
This is not permitted:
CREATE TABLE t1 ( ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(3) );