如何在 Oracle 中的视图上使用 AUTO_INCREMENT 创建 id
Posted
技术标签:
【中文标题】如何在 Oracle 中的视图上使用 AUTO_INCREMENT 创建 id【英文标题】:How to create id with AUTO_INCREMENT on a view in Oracle 【发布时间】:2016-10-27 15:59:58 【问题描述】:任何人都可以帮助在 oracle 11g 中的视图上创建 AUTO_INCREMENT 列。
谢谢
【问题讨论】:
我不遵循您要完成的工作。视图不持久化数据,它只是一个存储的查询。你想在基础表中创建一个持久的自动增量列吗?视图中增加数字列的非持久性(因此可能随时间变化)?还有什么? 使用ROWNUM Rownum 会随着数据的变化而变化,因此不一致 贾斯汀,我有一个视图,它将逗号分隔值从父表的列转换为行。因此,原始表中的 id 现在在视图中不是唯一的 id,它将重复逗号分隔values.So 我想在视图中创建一个新 ID。 正如上面提到的@JustinCave,视图只是一个存储的查询。如果不将值持久保存到基础表中,则无法真正保证它不会随着时间的推移而改变,因为新数据进入并适合排序的中间。 【参考方案1】:虽然不可能为其基础数据没有任何单一唯一标识符的视图返回单一唯一标识列,但可以返回唯一标识数据的复合值。例如,给定一个 CSV 数据表,每行都有一个唯一的 ID:
create table sample (id number primary key, csv varchar2(4000));
其中 CSV 列包含一串逗号分隔值:
insert into sample
select 1, 'a' from dual union all
select 2, 'b,c' from dual union all
select 3, 'd,"e",f' from dual union all
select 4, ',h,' from dual union all
select 5, 'j,"",l' from dual union all
select 6, 'm,,o' from dual;
以下查询将取消透视 csv 数据,复合值(ID
、SEQ
)将唯一标识每个 VAL
ue,ID
列标识数据来自的记录,SEQ
唯一标识 CSV 中的位置:
WITH pvt(id, seq, csv, val, nxt) as (
SELECT id -- Parse out individual list items
, 1 -- separated by commas and
, csv -- optionally enclosed by quotes
, REGEXP_SUBSTR(csv,'(["]?)([^,]*)\1',1,1,null,2)
, REGEXP_INSTR(csv, ',', 1, 1)
FROM sample
UNION ALL
SELECT id
, seq+1
, csv
, REGEXP_SUBSTR(csv,'(["]?)([^,]*)\1',nxt+1,1,null,2)
, REGEXP_INSTR(csv, ',', nxt+1, 1)
FROM pvt
where nxt > 0
)
select * from pvt order by id, seq;
ID SEQ CSV VAL NXT
---------- ---------- ---------- ---------- ----------
1 1 a a 0
2 1 b,c b 2
2 2 b,c c 0
3 1 d,"e",f d 2
3 2 d,"e",f e 6
3 3 d,"e",f f 0
4 1 ,h, [NULL] 1
4 2 ,h, h 3
4 3 ,h, [NULL] 0
5 1 j,"",l j 2
5 2 j,"",l [NULL] 5
5 3 j,"",l l 0
6 1 m,,o m 2
6 2 m,,o [NULL] 3
6 3 m,,o o 0
15 rows selected.
【讨论】:
以上是关于如何在 Oracle 中的视图上使用 AUTO_INCREMENT 创建 id的主要内容,如果未能解决你的问题,请参考以下文章