使用Python 批量解决 Oracle数据库违反唯一约束条件 问题

文章描述了如何使用Python的cx_Oracle库连接到Oracle数据库,执行SQL查询以获取表的最大ID值,然后动态调整相关序列的增量。
摘要由CSDN通过智能技术生成
import cx_Oracle
import json
cx_Oracle.init_oracle_client(lib_dir=r"D:\Program Files\instantclient_11_2")
dsn = cx_Oracle.makedsn('数据库地址', 端口, service_name='链接名称')
connection = cx_Oracle.connect(user='用户', password='密码', dsn=dsn)
cursor = connection.cursor()
query = "SELECT TABLE_NAME " \
        "FROM user_tables " \
        "WHERE TABLESPACE_NAME = 'HSWG_PAD'"
cursor.execute(query)
result = cursor.fetchall()
set_data = set()
for row in result:
    # 获取 table_name
    set_data.add(row[0])
print(set_data)
# 生成序列名称
for table_name in set_data:
    sequence_name = "SEQ_"+table_name
    try:
        query = "alter sequence {seqID} increment by 1".format(seqID=sequence_name)
        cursor.execute(query)
    except:
        print("error")
        pass
    query = "select +" + sequence_name + ".nextval from dual"
    seq_end = None
    try:
        cursor.execute(query)
        result = cursor.fetchall()
        # print("result", result)
        seq_end = result[0][0]
    except:
        pass
    if seq_end is None:
        continue
    query = "SELECT cols.table_name, cols.column_name, cons.constraint_name " \
            "FROM user_constraints cons " \
            "JOIN user_cons_columns cols " \
            "ON cons.constraint_name = cols.constraint_name " \
            "WHERE cons.constraint_type = 'P' " \
            "AND cols.position = 1 " \
            "AND cols.table_name = '{table_name}'".format(table_name=table_name)
    # print("query", query)
    idName = None
    try:
        cursor.execute(query)
        result = cursor.fetchall()
        # print("result", result)
        idName = result[0][1]
    except:
        # print("error")
        pass
    if idName is None:
        continue

    # print("table_name", table_name, "idName", idName, "seq_end", seq_end)
    query = "select max({idName}) from {table_name}".format(idName=idName, table_name=table_name)
    # print("query", query)
    max_id = None
    # try:
    cursor.execute(query)
    # 打印所有结果
    result = cursor.fetchall()
    # print("result", result)
    max_id = result[0][0]
    # except:
    #     pass
    add_id = 0
    if max_id:
        if max_id  >= seq_end:
            print("table_name", table_name, "idName", idName, "seq_end", seq_end, "max_id", max_id)
            add_id = max_id+ 1 - seq_end
        else:
            continue
    else:
        continue

    print("max_id", max_id, "add_id", add_id)
    query = "alter sequence {table_name} increment by {add_id}".format(table_name=sequence_name, add_id=add_id)
    cursor.execute(query)
    query = "select +" + sequence_name + ".nextval from dual"
    cursor.execute(query)
    result = cursor.fetchall()
    seq_end = result[0][0]
    print("seq_end", seq_end,"max_id", max_id, "add_id", add_id)
    try:
        query = "alter sequence {seqID} increment by 1".format(seqID=sequence_name)
        cursor.execute(query)
    except:
        print("error")
        pass

cursor.close()
connection.close()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值