【问题标题】:Insert statement with autoincrement parameter带有自动增量参数的插入语句
【发布时间】:2018-06-24 21:00:07
【问题描述】:

我正在尝试使用插入语句将数据插入到表中,结果来自 DB2 中的 select 语句。

我遇到了一个需要从特定值自动递增的主键问题,例如:从 100 向上,我应该告诉语句它应该从什么值递增,但它不起作用。

插入语句如下所示:

insert into table1 (col1, col2, col3, col4 ,col5)
    select par1, par2, par3, par4, par5 from table2;

使用此语句它会自动导入主键,这是错误的,因为它应该从特定值生成/自动递增。

我尝试创建一个变量并将其设置为 par1 像这样 var1=var1+1 但它不起作用。

有人有想法吗?

谢谢。

【问题讨论】:

  • 您能说出您在商业方面想要实现的目标吗? IMO 主键只是一些无关紧要的(只要是唯一的)值,围绕它的值构建任何逻辑都是一个非常严重的错误。
  • 我想创建一个临时表,我可以在其中导入数据,然后将该表中的数据导入到另一个表中,但是在第二个表中,主键从 10000 开始。因此值,我必须为以 10001 开头的行设置主键,然后为第二行 10002 设置主键,依此类推。只是想将临时表中的数据移动到另一个表中,但是临时表中缺少主键,而第二个表需要它。
  • insert语句省略会自动生成,为什么需要具体的值?
  • 它不会自动生成,因为创建表时并未考虑到此功能。因此我必须手动创建它。如果我省略主键,它会给出错误 Null not allowed。
  • 您是否考虑过创建具有特定起始值的序列?它可以作为读取操作的一部分递增。所以你可以将它包含在 SELECT 语句中

标签: sql select insert db2


【解决方案1】:

您可以首先设置默认值(如果是一次性加载)或基于其他一些逻辑(如 SELECT MAX(col))的某个最大值。

set initval = 100; 

然后你可以使用 ROW_NUMBER() 函数来生成一个运行序列。按顺序包括将标识主键的列。

insert into table1 (genkeycol, col1, col2, col3, col4 ,col5)
select initval + row_number() over(order by par1, par2) as genkeycol
par1, par2, par3, par4, par5 from table2;

理想情况下,您应该使用 GENERATED 列,这样您就不必担心这个逻辑。我不建议对大容量插入使用序列。

【讨论】:

    猜你喜欢
    • 2013-03-06
    • 2021-03-24
    • 1970-01-01
    • 2013-02-09
    • 2011-10-07
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多