1

我正在开发一个database schema我希望向客户提供的大型产品。

我是MySql数据库管理的新手。如何恢复.sql架构文件,以便它还将所有自动增量 id 列重置回0Null再次重置。

我实际上恢复到一个新的模式名称并插入了一条测试记录,发现自动 id 列从它们在最后一个模式名称中停止的位置开始递增。

我如何在MySql数据库建模中解决这个问题?

我希望始终能够为付费客户“分拆”我当前版本数据模型的精确副本。

谢谢你。

4

3 回答 3

5

您可以只转储架构,而无需通过这种方式转储数据:

$ mysqldump -d databasename > databasename-schema.sql

如果您使用 InnoDB 表(您应该这样做),则每次重新启动 MySQL 实例时都会重置自动增量值。它在每个表中重置的值等于当前存储在表中的最大值加 1。因此,如果您的表为空,则该值将为 1。

如果您不想在恢复后重新启动 MySQL 实例,您可以在恢复之前在 CREATE TABLE 语句中去除自动增量子句:

$ mysqldump -d databasename | sed -e 's/AUTO_INCREMENT=[0-9][0-9]*//' 
  > databasename-schema.sql

否则,您可以 ALTER TABLE 以在恢复后重置自动增量值。这必须在每个表的基础上完成,但您可以从 INFORMATION_SCHEMA 查询具有自动增量键的表的列表:

$ mysql -N -B -e "SELECT CONCAT('ALTER TABLE \`', table_schema, '\`.\`', 
  table_name, '\` AUTO_INCREMENT=1;') AS ddl FROM INFORMATION_SCHEMA.TABLES 
  WHERE table_schema = 'test' AND AUTO_INCREMENT IS NOT NULL" | mysql -v
于 2012-12-24T20:25:37.647 回答
1

您可以使用它来转储表结构,并且您会发现所有从头开始的自动增量主键,就像您之前定义的那样,它不会执行插入查询,而是会创建您所有的stored procedure,viewstables:

cat backup.sql | grep -v ^INSERT | mysql -u $USER -p
于 2012-12-24T19:13:20.330 回答
1

AUTO_INCREMENT 后重置

TRUNCATE `table`

并且当您INSERT之后运行批量查询(从您的数据备份)时,该AUTO_INCREMENT值将自动更新为正确的值(插入的记录+1)。

因此,您不需要手动更新AUTO_INCREMENT值(这是一种不好的做法)。

当您想从备份中恢复多于一个受外键约束的表时,您可以在 TRUNCATE+INSERT 之前禁用 FK 检查,并在完成后重新启用它。可以在此处找到详细信息:截断所有表(其中大部分有约束)。如何暂时放下它们

于 2014-03-23T22:17:55.640 回答