使用 Python 自动批量修改 MySQL 数据库中所有带有自增主键的表的自增起始值。非常适合数据库维护和运维新人,简单易懂,附完整代码。
什么是自增主键?
MySQL 中的自增主键(AUTO_INCREMENT
)是一种自动生成唯一编号的字段,常用于表的主键,保证每条记录有唯一标识。默认情况下,它会从1开始递增。
为什么要批量调整自增起始值?
- 避免主键冲突:比如多张表或者多个库合并时,想让自增主键跳跃一定数值避免冲突。
- 数据迁移和分库分表:预留一定偏移量,为以后扩展做准备。
- 数据清理后重设起点。
手动一张表一张表改,非常麻烦且易出错,于是我们用 Python 自动完成。
脚本功能
- 查询当前数据库中所有带自增主键的表
- 找出每个表自增字段的最大值
- 将自增起始值设置为“最大值 + 偏移量”
- 自动提交修改,打印执行结果
环境准备
-
安装 Python(推荐3.x版本)
-
安装 PyMySQL 库,命令行执行:
pip install pymysql
-
准备好 MySQL 数据库连接信息
完整代码
import pymysql
# === 配置区 ===
DB_CONFIG = {
"host": "localhost", # 数据库地址,一般是localhost或IP
"port": 3306, # 数据库端口,MySQL默认3306
"user": "root", # 数据库用户名
"password": "root", # 数据库密码,注意安全
"database": "vue_db", # 要操作的数据库名称
"charset": "utf8mb4" # 数据库字符编码,utf8mb4支持更多字符
}
OFFSET = 100 # 自增主键起始值的偏移量,比如当前最大ID加100
# 获取所有带有自增字段的表和字段名
def get_auto_increment_tables(conn, db_name):
with conn.cursor() as cursor:
# 查询 information_schema.columns 表,找出当前数据库中所有extra字段是auto_increment的列(即自增列)
sql = """
SELECT table_name, column_name
FROM information_schema.columns
WHERE table_schema = %s AND extra = 'auto_increment';
"""
cursor.execute(sql, (db_name,))
# 返回所有满足条件的表名和对应自增字段名
return cursor.fetchall()
# 获取指定表自增字段的当前最大值
def get_max_id(conn, table, column):
with conn.cursor() as cursor:
try:
# 查询指定表和列的最大ID值
cursor.execute(f"SELECT MAX(`{column}`) FROM `{table}`;")
result = cursor.fetchone()
# 如果查询结果为None,则返回0,否则返回最大值
return result[0] or 0
except Exception as e:
print(f"[!] 查询 {table} 最大值出错:{e}")
return 0
# 修改表的自增起始值
def alter_auto_increment(conn, table, new_value):
with conn.cursor() as cursor:
try:
# 执行ALTER TABLE命令,设置新的AUTO_INCREMENT起始值
cursor.execute(f"ALTER TABLE `{table}` AUTO_INCREMENT = {new_value};")
print(f"[✓] 设置 {table} 的 AUTO_INCREMENT 为 {new_value}")
except Exception as e:
print(f"[✗] 设置 {table} 的 AUTO_INCREMENT 失败:{e}")
# 主程序入口
def main():
# 建立数据库连接
conn = pymysql.connect(**DB_CONFIG)
try:
# 获取所有带自增字段的表和对应字段
tables = get_auto_increment_tables(conn, DB_CONFIG["database"])
print(f"共找到 {len(tables)} 个包含 AUTO_INCREMENT 的表。")
# 遍历所有表,分别获取最大ID并设置新的起始值
for table_name, column_name in tables:
max_id = get_max_id(conn, table_name, column_name) # 获取当前最大ID
new_auto_increment = max_id + OFFSET # 计算新的起始值
alter_auto_increment(conn, table_name, new_auto_increment) # 修改自增起始值
# 提交所有修改
conn.commit()
print("所有自增主键已处理完毕。")
finally:
# 关闭数据库连接,释放资源
conn.close()
if __name__ == "__main__":
main()
如何使用?
-
将上述代码保存为
adjust_auto_increment.py
文件。 -
修改
DB_CONFIG
配置,填写自己的数据库连接信息。 -
根据需求调整
OFFSET
偏移量。 -
运行脚本:
python adjust_auto_increment.py
-
观察终端输出,确认所有表的自增主键已成功调整。
注意事项
- 数据库权限:确保 MySQL 用户有修改表结构的权限。
- 备份数据:运行前务必备份数据库,避免意外导致数据损坏。
- 连接信息安全:避免泄漏密码,生产环境可使用环境变量等方式保护。
- 大数据表操作谨慎:若表非常大,调整操作可能会稍微影响性能。
总结
通过这段简单的 Python 脚本,实现了对 MySQL 多张表自增主键起始值的批量调整,避免了手工修改的繁琐和风险。非常适合快速上手数据库维护任务,也可作为自动化运维工具的一部分。