DB2 sql:如何生成一定长度的唯一标识

时间:2019-03-18 19:30:25

标签: sql python-3.x pandas list db2

我正在尝试使用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。

2 个答案:

答案 0 :(得分:1)

您使用row_number()

生成ID
SELECT *,row_number() over( order by (select null)) as id
    FROM FORM_RPT

答案 1 :(得分:0)

数据库提供了生成唯一ID的功能。无需为此使用额外的编码。

在Db2中,如果仅用于单个表或要将其作为独立数据库对象的数据库序列ID,则可以使用标识列。

为什么需要一定的长度?