【问题标题】:Oracle 10g Add primary key as sequence for existing tableOracle 10g 添加主键作为现有表的序列
【发布时间】:2012-11-04 10:37:30
【问题描述】:

我有三张表——会员、付款、奖励,上面有超过 3000 条记录。 目前Member 表有memberId 作为主键,memberid 是Payment 和Award 表的外键。注意 memberid 不是自动生成的字段。这些表是在 Access 中创建的。 我的工作是迁移到 Oracle 并添加主键,比如 mem_id 作为序列号到 Member 表,并将 mem_id 作为外键添加到 Payment 和 Award 表。

  • 我已经迁移了 Oracle 中的表。
  • 将列名mem_id添加到成员表中

    alter table member add mem_id number Unique;

  • 创建了一个序列

          create Sequence Mem_seq
          START WITH 1
          MAXVALUE 999999999
          MINVALUE 1
          NOCYCLE
          NOCACHE
          NOORDER;
    
  • 由于所有记录的 mem_id 为空,我更新列

       Update member 
       Set mem_id =  mem_seq.nextval
       Where mem_id IS NULL;
    

到目前为止效果很好,现在我的挑战是将外键添加到付款表和奖励表 - 在 Payment 表中创建 mem_id 列

       alter table PAYMENT
        add mem_id number Unique;
  • 我的想法是更新付款表中的mem_id

  • 更新语句是

       update PAYMENT
       set PAYMENT.mem_id = MEMBER.mem_id
       where PAYMENT.memberid = MEMBER.memberid; 
    

我收到错误ORA-00904 member.memberid: invalid identifier 需要帮助来解决这个问题。

【问题讨论】:

  • 为什么不继续使用memberid呢?将序列的start with 值设置为max(memberid) + <<something>>。并且现有记录可以保持其键值不变。

标签: sql oracle oracle10g


【解决方案1】:

尝试使用以下内容更新 PAYMENT 表

update payment p set p.mem_id  = (select mem_id from member where 
memberid = p.memberid);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2012-08-01
    • 2012-07-12
    相关资源
    最近更新 更多