我正在尝试使用python生成一个唯一ID的列表,这些ID可以用作我们DB2数据库上表的索引。我的起始输入是来自单独表的ID列表。我需要获取此ID列表并生成其他ID列表(在此处放置在 formlist 变量中)。这些其他ID必须是唯一的,并且在目标数据库表上必须不存在(表名称为下面显示为 FORM_RPT
到目前为止,我已经尝试过以下操作:
import ibm_db_dbi
import ibm_db
import numpy as np
import pandas as pd
class Gen_IDs():
def __init__(self, mycon, opt_ids):
"""Create an ID Generator object, requires an opt_id list as argument"""
self.mycon = mycon
self.opt_ids = opt_ids
def gen_form(self):
"""generates unique form ids based off an option list"""
sql = """SELECT *
FROM FORM_RPT"""
df = pd.read_sql(sql, self.mycon)
formlist = list(df["FORM_RPT_ID"])
stack = 0
opt_list = []
while(stack < len(self.opt_ids)):
f = np.random.randint(1000, 9999)
#if f in df['FORM_RPT_ID'].values:
if formlist.count(f) > 0:
pass
if f in opt_list:
pass
else:
opt_list.append(f)
stack += 1
return opt_list
此代码生成的很好,但令我感到困惑的是,生成的ID的一小部分仍然显示为目标数据库中的ID。生成的ID必须为4位整数。
以下是其工作方式的示例:
optionList = [1001, 1002, 1003, 1004, 1005]
formlist = [2001, 2002, 2003, 2004, 2005]
gm = Gen_Ids(optionList)
new_form_list = gm.gen_form()
当前,我得到一个返回的列表,但是新列表有时会在 formList 变量中包含ID。
答案 0 :(得分:1)
您使用row_number()
SELECT *,row_number() over( order by (select null)) as id
FROM FORM_RPT
答案 1 :(得分:0)
数据库提供了生成唯一ID的功能。无需为此使用额外的编码。
在Db2中,如果仅用于单个表或要将其作为独立数据库对象的数据库序列ID,则可以使用标识列。
为什么需要一定的长度?