如何使用mysqldump转储默认时间戳值?

时间:2017-01-10 16:48:09

标签: mysql mariadb

我的数据库中有以下列:

MariaDB [mydb]> desc MY_TABLE;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
...
| SOME_DATE      | timestamp    | NO   |     | NULL    |                |
...
+----------------+--------------+------+-----+---------+----------------+

当我使用mysqldump -p -u myuser mydb转储数据库时,它将MY_TABLE定义为:

CREATE TABLE `MY_TABLE` (
  ...
  `SOME_DATE` timestamp NOT NULL,
  ...
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;

所以当我加载转储时:

MariaDB [mydb_after_loading_dump]> desc MY_TABLE;
+----------------+--------------+------+-----+---------------------+----------------+
| Field          | Type         | Null | Key | Default             | Extra          |
+----------------+--------------+------+-----+---------------------+----------------+
...
| SOME_DATE      | timestamp    | NO   |     | 0000-00-00 00:00:00 |                |
...
+----------------+--------------+------+-----+---------------------+----------------+

如何强制mysqldump转储正确的默认值SOME_DATE

服务器版本:10.1.14-MariaDB-1~trusty

mysql版本:Ver 15.1 Distrib 10.1.14-MariaDB, for debian-linux-gnu (x86_64)

mysqldump版本:mysqldump Ver 10.16 Distrib 10.1.14-MariaDB, for debian-linux-gnu (x86_64)

1 个答案:

答案 0 :(得分:2)

必须在服务器运行时使用选项explicit-defaults-for-timestamp=on创建表。以下是解释为什么不会发生的原因。

  

<强>更新

     

正如RadekPostołowicz在评论中指出的那样,效果可能相同   通过运行explicit-defaults-for-timestamp=off语句明确删除ALTER,也可以通过DEFAULT实现   条款没有改变NULL - 能力。

现在服务器必须运行explicit-defaults-for-timestamp=off(默认值)。因此,当您转储表结构时,它会被正确转储,就像它被创建一样。但是当你试图恢复它时,由explicit-defaults-for-timestamp=off引起的晦涩逻辑开始了。你的表显然在结构的前面有另一个TIMESTAMP列,所以SOME_DATE没有得到{{1} s,但它确实得到了默认值。

如果您确实需要以完全相同的方式恢复它,则必须将CURRENT_TIMESTAMP设置回explicit-defaults-for-timestamp(这将需要重新启动服务器)。问题是,你为什么需要它?如果您没有像评论中所说的那样使用默认值,那么该列是否具有默认值无关紧要。

为什么只能使用on

创建表格

当服务器以explicit-defaults-for-timestamp=on(默认)运行时,除非代码被黑客攻击,否则无法创建此表结构:

explicit-defaults-for-timestamp=off

如果未指定列属性,则使用自动更新属性创建第一个时间戳,使用默认值为0的其他属性创建:

MariaDB [test]> SELECT @@explicit_defaults_for_timestamp;
+-----------------------------------+
| @@explicit_defaults_for_timestamp |
+-----------------------------------+
|                                 0 |
+-----------------------------------+

如果您指定MariaDB [test]> CREATE TABLE t1 (ts1 TIMESTAMP, ts2 TIMESTAMP); MariaDB [test]> desc t1; +-------+-----------+------+-----+---------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------+------+-----+---------------------+-----------------------------+ | ts1 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | | ts2 | timestamp | NO | | 0000-00-00 00:00:00 | | +-------+-----------+------+-----+---------------------+-----------------------------+ 2 rows in set (0.01 sec)

,则相同
NOT NULL

如果您设置了MariaDB [test]> CREATE TABLE t4 (ts1 TIMESTAMP NOT NULL, ts2 TIMESTAMP NOT NULL); MariaDB [test]> desc t4; +-------+-----------+------+-----+---------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------+------+-----+---------------------+-----------------------------+ | ts1 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | | ts2 | timestamp | NO | | 0000-00-00 00:00:00 | | +-------+-----------+------+-----+---------------------+-----------------------------+ 属性,则会在说明中看到它:

DEFAULT

您无法将MariaDB [test]> CREATE TABLE t2 (ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP DEFAULT 0); MariaDB [test]> desc t2; +-------+-----------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------+------+-----+---------------------+-------+ | ts1 | timestamp | NO | | 0000-00-00 00:00:00 | | | ts2 | timestamp | NO | | 0000-00-00 00:00:00 | | +-------+-----------+------+-----+---------------------+-------+ NOT NULL列为默认值:

NULL

如果您使用MariaDB [test]> CREATE TABLE t5 (ts1 TIMESTAMP NOT NULL DEFAULT NULL, ts2 TIMESTAMP NOT NULL DEFAULT NULL); ERROR 1067 (42000): Invalid default value for 'ts1' 列制作NULL列,您会看到它们:

NULL

但是如果你有MariaDB [test]> CREATE TABLE t3 (ts1 TIMESTAMP NULL DEFAULT NULL, ts2 TIMESTAMP NULL DEFAULT NULL); +-------+-----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------+------+-----+---------+-------+ | ts1 | timestamp | YES | | NULL | | | ts2 | timestamp | YES | | NULL | | +-------+-----------+------+-----+---------+-------+ ,那么可以通过使用explicit-defaults-for-timestamp=on语句的最简单变体获得确切的表格结构:

CREATE