from sqlalchemy import create_engine, text, inspect
from sqlalchemy.exc import SQLAlchemyError
from grant.sql_connection import jldb_conn as engine
def reset_auto_increment_with_temp_table(original_table_name):
temp_table_name = f"temp_{original_table_name}"
try:
with engine.connect() as connection:
trans = connection.begin()
try:
# 0. 先删除可能存在的临时表(如果存在)
connection.execute(text(f"DROP TABLE IF EXISTS {temp_table_name}"))
# 1. 获取原表结构信息
inspector = inspect(engine)
columns = inspector.get_columns(original_table_name)
column_names = [col['name'] for col in columns]
non_id_columns = [col['name'] for col in columns if col['name'] != 'id']
columns_str = ', '.join(non_id_columns)
# 2. 创建临时表(不包含自增主键)
connection.execute(text(f"""
CREATE TABLE {temp_table_name} AS
SELECT {columns_str} FROM {original_table_name} WHERE 1=0
"""))
# 3. 插入数据(不包含id列)
connection.execute(text(f"""
INSERT INTO {temp_table_name} ({columns_str})
SELECT {columns_str}
FROM {original_table_name}
ORDER BY id
"""))
# 4. 删除原表
connection.execute(text(f"DROP TABLE {original_table_name}"))
# 5. 重新创建原表结构(包含自增主键)
# 先创建表结构(不含数据)
connection.execute(text(f"""
CREATE TABLE {original_table_name} LIKE {temp_table_name}
"""))
# 添加自增主键列
connection.execute(text(f"""
ALTER TABLE {original_table_name}
ADD COLUMN id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST
"""))
# 6. 将数据从临时表复制回原表
connection.execute(text(f"""
INSERT INTO {original_table_name} ({columns_str})
SELECT {columns_str} FROM {temp_table_name}
"""))
# 7. 删除临时表
connection.execute(text(f"DROP TABLE {temp_table_name}"))
# 8. 重置自增计数器
connection.execute(text(f"ALTER TABLE {original_table_name} AUTO_INCREMENT = 1"))
trans.commit()
print("ID重新编号成功!")
except Exception as e:
trans.rollback()
print(f"操作失败: {e}")
except Exception as e:
print(f"数据库连接错误: {e}")
finally:
engine.dispose()
# 使用示例
if __name__ == "__main__":
reset_auto_increment_with_temp_table('sales_flash')