【问题标题】:DB2 sql: How to generate unique ids of a certain lengthDB2 sql:如何生成一定长度的唯一 id
【发布时间】:2019-03-18 19:30:25
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    你使用row_number()生成id

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

    【讨论】:

    • 我已经将你的代码 sn-p 单独运行到一个 sql 解释器中,它给了我一个错误。你能提供一个如何与代码绑定的例子吗?也许我只是需要为您的解决方案提供更好的上下文。
    • 将 * 替换为列名并指定您需要的顺序。但是这个解决方案只会为单个查询提供唯一编号 - 下次编号将再次以 1 开始。
    【解决方案2】:

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

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

    为什么需要一定的长度?

    【讨论】:

    • 我在临时表中工作,某些表只有一定长度的键。长度限制与其他部门的要求有关。所以我必须在这里维持现状。
    • 对我来说听起来很奇怪 - 4 位数字键限制了数据量。您可以从 1000 for you identity 列开始,但我建议仔细检查实际需求(以获得良好的解决方案)
    • 这对我来说就像是一条评论。如果问题和要求不清楚,也许应该先解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多