我正在开发一个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 检查,并在完成后重新启用它。可以在此处找到详细信息:截断所有表(其中大部分有约束)。如何暂时放下它们