如何在没有主键的表上按顺序更新表?

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

Sql 适配器。如何更新没有主键的 DataTable

如何获取表的 PRIMARY KEY COLUMNS(在 COMPOSITE 主键的情况下)

如何在SQL Server中获取具有复合主键的表列表?

如何在没有主键的情况下从连接表中创建实体