在my.cnf里面我指定了:
sql-mode = STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_VALUE_ON_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ERROR_FOR_DIVISION_BY_ZERO,ONLY_FULL_GROUP_BY
然后我重新启动了mysql服务器:
sudo systemctl restart mysql
然后我检查了SQL_MODE变量的值:
show variables like '%sql_mode%';
+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode | STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_VALUE_ON_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ERROR_FOR_DIVISION_BY_ZERO,ONLY_FULL_GROUP_BY |
+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
然后我用命令转储mydatabase:
mysqldump --user root --password=root --host=localhost --add-drop-table --add-locks --allow-keywords --comments --complete-insert --create-options --disable-keys --extended-insert --lock-tables --quick --quote-names --routines --set-charset --dump-date --tz-utc --verbose --databases mydatabase
然后我看到了输出:
... omitted
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
... omitted
预期产出:
... omitted
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_VALUE_ON_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ERROR_FOR_DIVISION_BY_ZERO,ONLY_FULL_GROUP_BY' */;
... omitted
怎么了?
答案 0 :(得分:1)
这里没有错。该行与转储文件开头的另一行类似,会在导入期间临时更改sql mode
以获得受控环境。这可确保您的服务器设置(例如character set
,time zone
或sql mode
)不会影响数据的添加方式。会有一个
/*!40101 SET SQL_MODE=@OLD_SQL_MODE*/;
转储结束时在导入完成后重置模式(以及其他设置)。服务器配置不是转储文件的一部分,您必须单独备份它。
这是默认行为,请参阅NO_AUTO_VALUE_ON_ZERO
的文档:
NO_AUTO_VALUE_ON_ZERO会影响AUTO_INCREMENT列的处理。通常,通过在其中插入NULL或0来为列生成下一个序列号。 NO_AUTO_VALUE_ON_ZERO将此行为抑制为0,以便只有NULL生成下一个序列号。
如果0已存储在表的AUTO_INCREMENT列中,则此模式非常有用。 [...]例如,如果您使用mysqldump转储表然后重新加载它,MySQL通常会在遇到0值时生成新的序列号,从而生成一个内容与转储的内容不同的表。 [...] mysqldump现在自动在其输出中包含一个启用NO_AUTO_VALUE_ON_ZERO 的语句,以避免此问题。