如何在没有主键的表上按顺序更新表?
Posted
技术标签:
【中文标题】如何在没有主键的表上按顺序更新表?【英文标题】:How to update table with sequentional on table without primary key? 【发布时间】:2020-10-06 12:52:04 【问题描述】:在 Linux v11.1 上的 DB2 中,我有一个表:
COL1 COL2 "COLn 50 more columns"
A A
A A
B A
B B
etc 3 million rows
可以有多行具有相同的行,例如我的示例中的前两行(很明显表上没有主键)。
现在我必须添加新的列 ID 并为每一行设置唯一的序号。 结果应该是:
COL1 COL2 "COLn 50 more columns" ID
A A 1
A A 2
B A 3
B B 4
etc 3 million rows
如何编写这样的更新语句来更新 ID 列? 问候
【问题讨论】:
ID
列中的序列是否依赖于所有 50 列,仅依赖前 2 列,还是其他?
每一行都应该有自己的ID号。问题是两行或更多行在所有 50 列中可能包含完全相同的数据。
"...显然表上没有主键" 这一点都不明显。这只是意味着'COL1,COL2'不是主键。
经验教训:总是在你的表中有一个主键。
【参考方案1】:
这是一种使用 identity column
的方法,它假定不存在现有的主键或标识列。
alter table myschema.mytab add column id integer not null default 0 ;
alter table myschema.mytab alter column id drop default ;
alter table myschema.mytab alter column id set generated always as identity ;
update myschema.mytab set id = default ;
-- optional, if you want the new ID column to be a surrogate primary key
alter table myschema.mytab add constraint pkey primary key(id) ;
reorg table myschema.mytab ;
runstats on table myschema.mytab with distribution and detailed indexes all;
【讨论】:
谢谢,这比我预期的还要好。完美运行。【参考方案2】:试试这个:
alter table myschema.mytab add column id integer not null default 0 ;
UPDATE (SELECT ID, ROWNUMBER() OVER() RN FROM myschema.mytab) SET ID = RN;
-- Or even simplier:
-- UPDATE myschema.mytab SET ID = ROWNUMBER() OVER();
【讨论】:
第一次更新工作正常,它设置了序号。第二次(已注释)更新不起作用,它没有更新任何行。 @folow 检查example。以上是关于如何在没有主键的表上按顺序更新表?的主要内容,如果未能解决你的问题,请参考以下文章
给没有id主键的表添加id,并设置为not null 然后填充自增id