我的数据库中有以下列:
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)
答案 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