我正在开发一个database schema我希望向客户提供的大型产品。
我是MySql数据库管理的新手。如何恢复.sql架构文件,以便它还将所有自动增量 id 列重置回0或Null再次重置。
我实际上恢复到一个新的模式名称并插入了一条测试记录,发现自动 id 列从它们在最后一个模式名称中停止的位置开始递增。
我如何在MySql数据库建模中解决这个问题?
我希望始终能够为付费客户“分拆”我当前版本数据模型的精确副本。
谢谢你。
我正在开发一个database schema我希望向客户提供的大型产品。
我是MySql数据库管理的新手。如何恢复.sql架构文件,以便它还将所有自动增量 id 列重置回0或Null再次重置。
我实际上恢复到一个新的模式名称并插入了一条测试记录,发现自动 id 列从它们在最后一个模式名称中停止的位置开始递增。
我如何在MySql数据库建模中解决这个问题?
我希望始终能够为付费客户“分拆”我当前版本数据模型的精确副本。
谢谢你。
您可以只转储架构,而无需通过这种方式转储数据:
$ 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
您可以使用它来转储表结构,并且您会发现所有从头开始的自动增量主键,就像您之前定义的那样,它不会执行插入查询,而是会创建您所有的stored procedure,views和tables:
cat backup.sql | grep -v ^INSERT | mysql -u $USER -p
AUTO_INCREMENT 后重置
TRUNCATE `table`
并且当您INSERT之后运行批量查询(从您的数据备份)时,该AUTO_INCREMENT值将自动更新为正确的值(插入的记录+1)。
因此,您不需要手动更新AUTO_INCREMENT值(这是一种不好的做法)。
当您想从备份中恢复多于一个受外键约束的表时,您可以在 TRUNCATE+INSERT 之前禁用 FK 检查,并在完成后重新启用它。可以在此处找到详细信息:截断所有表(其中大部分有约束)。如何暂时放下它们