14

我有一些没有主键的列,想添加一个主键列

NAME    Age
-------------
Peter   45
Bob     25
John    56
Peter   45

一些同事建议添加带有序列和触发器的PK Add a auto increment primary key to existing table in oracle

这很好,但我的客户使用无权添加序列或触发器的数据库用户。我想防止联系数十名 DBA 管理员来更改用户权限或运行我的脚本。

这是我的建议,即添加仅包含更新语句的 PK:(我在第 2 步中需要帮助)

第 1 步:创建 ID 列(我对此拥有数据库权限

ALTER TABLE PERSON ADD ID NUMBER(10,0);

第 2 步: 问题:我可以根据行的顺序或其他东西用唯一值初始化 ID 列吗?如何?

UPDATE PERSON SET ID = something-unique

第 3 步:添加主键约束后缀:(我 DB 对此有权限

ALTER TABLE PERSON ADD CONSTRAINT PK_ID PRIMARY KEY(ID);

第 4 步:后记:主键由我的应用程序管理和添加。

这将是结果:

ID(PK)  NAME    Age
---------------------
1       Peter   45
2       Bob     25
3       John    56
4       Peter   45

谢谢各位!

4

2 回答 2

30
Update person set id = rownum;
于 2013-11-06T08:54:07.933 回答
1

这个想法非常幼稚,但如果您的表没有大量行,应该可以正常工作。

对于第 2 步,运行一个 for 循环,如:

declare
    i pls_integer :=1;
     begin
    for rec in (select name,age, rowid from table_name)
    loop
    update table_name set id = i 
    where 
     table_name.name=rec.name 
     and table_name.age=rec.age 
     and table_name.rowid = rec.rowid;
    i:=i+1;
    end loop;
end;
于 2013-11-06T10:37:26.053 回答