【问题标题】:Add a primary key column to an old table向旧表添加主键列
【发布时间】:2022-01-07 12:52:12
【问题描述】:

所以我有一个大约 50 多行的表。目前该表中没有任何主键/ID 列。现在,如果我必须添加一个主键列,它不允许我这样做,因为表中已经存在数据,因此没有唯一列或列组合。谁能建议我如何将主列添加到包含数据的现有表中。

【问题讨论】:

  • 在表中包含数据并不禁止添加 PK 或 UK。可能的问题是,如果您想要的任何组合都有重复项。如果是这种情况,那么您需要决定如何处理重复项,或者修改那里的列,或者删除重复项。当您消除重复项时,您肯定可以添加一个 PK/UK
  • 或添加一个新列以用作合成主键、标识列(如果您使用的是最新版本的 Oracle)或通过序列和触发器设置。这取决于完整的要求是什么,PK 将用于什么 - 如果另一个表已经有数据现在需要被视为该表的 FK,那么您仍然有非唯一数据的问题......跨度>
  • 如果您当前的列(或组合)都不能作为键,您必须添加一个新列。这回答了你的问题了吗? Add a auto increment primary key to existing table in oracle

标签: oracle oracle-sqldeveloper


【解决方案1】:

(从 12.1 开始)您可以使用以下任一方法将新的自动递增代理键添加到表中:

alter table t
  add ( t_id integer generated by default as identity );

或者

create sequence s;
alter table t
  add ( t_id integer default s.nextval );

这些设置所有现有行的值。所以在大桌子上可能需要一段时间!

不过,您还应该考虑在业务键上添加唯一约束。为此,请采取 Marmite Bomber 建议的步骤。

【讨论】:

    【解决方案2】:

    在您的情况下,当表由于缺少 PK 定义遭受一些重复记录时,您可以进行逐步恢复。

    在第一步中,您禁止创建新的重复行。

    假设您的 PK 候选列 是 col1, col2,如下例所示:

    CREATE TABLE test_pk as
    SELECT 'A' col1, 1 col2 FROM dual UNION ALL
    SELECT 'A' col1, 2 col2 FROM dual UNION ALL
    SELECT 'B' col1, 1 col2 FROM dual UNION ALL
    SELECT 'B' col1, 1 col2 FROM dual;
    

    您无法定义 PK,因为存在重复

    ALTER table test_pk  ADD CONSTRAINT my_pk UNIQUE (col1, col2);
    -- ORA-02299: cannot validate (xxx.MY_PK) - duplicate keys found
    

    但您可以在 PK 列上创建索引,并在状态 ENABLE NOVALIDATE 中设置约束。

    这将容忍现有的重复,但拒绝新的一次。

    CREATE INDEX my_pk_idx ON test_pk(col1, col2);
    
    ALTER TABLE test_pk
    ADD CONSTRAINT my_pk UNIQUE (col1,col2) USING INDEX my_pk_idx
    ENABLE NOVALIDATE;
    

    现在您可以插入新的唯一行...

    INSERT INTO test_pk (col1, col2) VALUES ('A', 3);
    -- OK
    

    ...但您不能创建新的重复项:

    INSERT INTO test_pk (col1, col2) VALUES ('A', 1);
    -- ORA-00001: unique constraint (xxx.MY_PK) violated
    

    稍后在第二步中,您可能会决定清理表和VALIDATE约束,这将生成一个完美的主键正如预期的那样:

    -- cleanup
    DELETE FROM TEST_PK 
    WHERE col1 = 'B' AND col2 = 1 AND rownum = 1;
    
    ALTER TABLE test_pk MODIFY CONSTRAINT my_pk ENABLE VALIDATE;
    

    【讨论】:

      猜你喜欢
      • 2013-11-17
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-22
      相关资源
      最近更新 更多