【发布时间】:2008-10-28 15:43:07
【问题描述】:
我在一个 Oracle DB 中有这个表,它在 3 个数据列上定义了一个主键。我想删除主键约束以允许这些列具有重复数据的行,并创建一个新列“id”以包含这些行的自动递增整数 ID。我知道如何创建一个序列和触发器来为添加到表中的新行添加一个自动递增的 ID,但是是否可以编写一个 PL/SQL 语句来为表中已经存在的所有行添加唯一的 ID?
【问题讨论】:
我在一个 Oracle DB 中有这个表,它在 3 个数据列上定义了一个主键。我想删除主键约束以允许这些列具有重复数据的行,并创建一个新列“id”以包含这些行的自动递增整数 ID。我知道如何创建一个序列和触发器来为添加到表中的新行添加一个自动递增的 ID,但是是否可以编写一个 PL/SQL 语句来为表中已经存在的所有行添加唯一的 ID?
【问题讨论】:
创建序列后:
update mytable
set id = mysequence.nextval;
【讨论】:
如果您只是对序列使用整数,则可以使用 rownum 更新 id。例如
update
table
set id = rownum
然后您需要将序列重置为下一个有效 id。
【讨论】:
这是你需要的吗?
UPDATE your_table
SET id = your_seq.nextval;
这假设您不关心主键的顺序。
【讨论】:
首先您应该检查您的 PCTFREE...是否有足够的空间让每一行变得更长?
如果您选择了一个非常小的 PCTFREE,或者您的数据有很多增加长度的更新,您可能会开始链接每一行以将其作为更新来执行。
作为一名 CTAS,你几乎肯定会更好。
创建表 t2 as select seq.nextval, t1.* from t1.
删除t1
将 t2 重命名为 t1。
【讨论】: