【问题标题】:Oracle SQL - Add Primary Key to tableOracle SQL - 向表添加主键
【发布时间】:2013-11-17 09:48:29
【问题描述】:

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

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

有些同事建议添加一个带有序列和触发器的PKAdd 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 步: 添加主键约束后缀:(I 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

谢谢各位!

【问题讨论】:

  • WW 给出了基于序列号填充 PK 的方法,但在您的问题中,您说“...基于行的顺序”。您是否为行定义了顺序,例如“created_at”时间戳?
  • 我已经用更明确的问题更新了我的文本。谢谢WW!

标签: sql oracle key add


【解决方案1】:
Update person set id = rownum;

【讨论】:

    【解决方案2】:

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

    对于第 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;
    

    【讨论】:

    • Arnab:您的问题目标正确,但此解决方案不起作用。即使对于在我的示例中只有 100 个用户的有限数据库,我也可以有 2 次:John - 56 岁。然后上面的更新将生成一个相同的主键。但是上面的解决方案给出了不同的主要。感谢大家一起思考!
    • 好吧..我不知道你会有重复的行..我已经修改了我的答案,所以它现在应该可以工作了。但是,理想情况下,我认为您的表中不应该有重复的行
    • 阿纳布:谢谢。您的答案现在有效。根据您的反馈,我在问题中添加了重复行。干得好。
    • 为什么这个想法很幼稚?
    猜你喜欢
    • 2022-08-22
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多