2015-10-06 72 views
4

我有一個表,其中包含從應用程序自動遞增的主鍵列。如何將Oracle 12c中的列修改爲標識列Oracle 12c:如何將現有主鍵列修改爲標識列?

樣本的情況下,提供如下─

create table tmp_identity (
    id number(100) primary key, 
    value varchar2(100) 
); 

說我們填充表數據 - 以下

ID  VALUE 
--------------- 
1   Sample 1 
2   Sample 2 
3   Sample 3 

我們正在打算做的是把這個id列到身份第列將會 -

  • 從4

我該怎麼辦呢自動遞增1

  • 開始? 如果這是不可能的,那麼是否有可用的解決方法?

  • +0

    是否'ID號,你不應該在這種情況下,添加start with 4(100 )'專欄真的有精確100 ?在Oracle上,精度可以從1到38,不能超過。 – krokodilko

    回答

    -1

    您可以從id列使用下面的查詢

    ALTER TABLE tmp_identity 
    RENAME COLUMN id TO identity; 
    

    要自動增量由1重命名爲identity4開始,我們可以使用序列。

    CREATE SEQUENCE identity_incre 
    MINVALUE 4 
    START WITH 4 
    INCREMENT BY 1; 
    

    要使用identity_incre順序查詢

    INSERT INTO suppliers 
    (identity, VALUE) 
    VALUES 
    (identity_incre.NEXTVAL, 'sample4'); 
    
    +1

    將列重命名爲「身份」不會使其成爲「身份」列: –

    +0

    我並不是指重命名「id」列...... –

    4

    你不能把現有列它變成一個真正的標識列,但您可以通過使用一個序列作爲獲得類似的行爲列的默認值。

    create sequence seq_tmp_identity_id 
        start with 4 
        increment by 1; 
    

    然後使用:

    alter table tmp_identity 
        modify id 
        default seq_tmp_identity_id.nextval; 
    

    使列中使用的序列作爲默認值。如果你願意,你可以使用default on null覆蓋插入過程中提供一個明確的null值(這是接近你可以得到一個標識列)

    如果你想有一個真正標識列,你將需要刪除當前id列,然後將其重新添加作爲一個標識列:

    alter table tmp_identity drop column id; 
    
    alter table tmp_identity 
        add id number(38) 
        generated always as identity; 
    

    需要注意的是,這樣所有的行獲得新的唯一編號

    +0

    確定您可以「修復」現有表。只需使用'default seq_tmp_identity_id.nextval'解決方案。 –

    +0

    通過修復,我的意思是擺脫這種解決方案 –