簡體   English   中英

在表的新列中更新序列號

[英]Update sequence Number in a new Column in Table

輸入

create table myprojects ( startdate date, enddate date, profit  number);        
insert into myprojects (startdate, enddate,profit ) values(to_date('1/5/2019','mm/dd/yyyy'),to_date('5/1/2019','mm/dd/yyyy'),100);        
insert into myprojects (startdate, enddate,profit ) values(to_date('1/6/2019','mm/dd/yyyy'),to_date('2/10/2019','mm/dd/yyyy'),50);   
alter table myprojects add ( projectid number ); 

現在,我在此表中添加了新列。 如何為每一行填充此列的值(例如1,2)?

使用以下語句,它可以正常工作。

CREATE SEQUENCE myseq  START WITH 1   INCREMENT BY 1   CACHE 20 
/
update myprojects set projectid=myseq.nextval

  1. 但是,使用以下語句只會將1更新為所有記錄。 為什么?

     update myprojects set projectid=(select nvl(max(projectid),0) +1 from myprojects) 
  2. 有什么方法可以在不創建或不使用序列的情況下實現相同目標?

如果您使用的是Oracle 12c及更高版本,並且對Identity列滿意,則可以使用以下alter table命令,並且oracle會為您生成數字。

alter table myprojects add ( projectid number generated always as identity);

db <> fiddle演示

在實際項目中使用它之前,請先閱讀Oracle文檔中的“ Identity column

干杯!!

這是使用merge一種方法:

merge into myprojects p
      using (select p.*, row_number() over (order by startdate) as x from myprojects p) pp
      on (p.rowid = pp.rowid)
when matched then update set projectid = x;

因為projectid列的所有值在開始都是空的,所以您試圖同時更新所有值而沒有任何過濾條件。 考慮使用row_number()分析函數生成連續的唯一整數:

update myprojects p
   set projectid = ( with t as ( 
                         select m.*,
                                row_number() 
                                     over (order by startdate, enddate, profit) as rn
                           from myprojects m
                    )  
                    select rn
                      from t
                     where t.startdate = p.startdate
                       and t.enddate = p.enddate
                       and t.profit = p.profit
                     ); 

作為一種替代方式。 row_number()函數的order by子句以及匹配條件( t.startdate = p.startdate and t.enddate = p.enddate and t.profit = p.profit )中使用的表的所有列( startdateenddateprofitt.startdate = p.startdate and t.enddate = p.enddate and t.profit = p.profit的) where條件得到了更新操作的唯一性。

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM