[英]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更新为所有记录。 为什么?
update myprojects set projectid=(select nvl(max(projectid),0) +1 from myprojects)
有什么方法可以在不创建或不使用序列的情况下实现相同目标?
如果您使用的是Oracle 12c及更高版本,并且对Identity列满意,则可以使用以下alter table命令,并且oracle会为您生成数字。
alter table myprojects add ( projectid number generated always as identity);
在实际项目中使用它之前,请先阅读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
)中使用的表的所有列( startdate
, enddate
, profit
) t.startdate = p.startdate and t.enddate = p.enddate and t.profit = p.profit
的) where
条件得到了更新操作的唯一性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.