close

在 Oracle 的世界裡沒有自動編號欄位,所以在 insert 單筆資料時,會用 select max(id) from tablename 這樣的方法來取得序號欄位的值。

今天遇到的狀況是,要把資料表 abc_company 的欄位轉進新的資料表 abc_detail 裡頭,原本打算用以下的 SQL statement 來塞資料:

insert into abc_detail
select (select max(sid) from abc_detail) as ssid, sid as company_sid, 
abc_name, abc_note, created, created_user, updated, updated_user 
from abc_company;

但是一直出現錯誤訊息「ORA-00001: 違反必須為唯一的限制條件 (OTCDATA.SYS_C0017858)」。

 

在 "INSERT using LOOP with SELECT" 這篇學到可以用 row_number() 這個 function 來製作出列號,因為我要附加在既有資料之後,所以編號我會再多加上既有的編號數:

(select max(sid) from abc_detail)

 

加起來就是這樣:

insert into abc_detail
select row_number() over (order by null) + (select max(sid) from abc_detail) as ssid, sid as company_sid, 
abc_name, abc_note, created, created_user, updated, updated_user 
from abc_company;

 

或者也可以使用 Oracle Sequence Object:《Oracle Sequence 物件使用》來處理遞增序號欄位。

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 小攻城師 的頭像
    小攻城師

    小攻城師的戰場筆記

    小攻城師 發表在 痞客邦 留言(0) 人氣()