Oracle 为视图创建持久且唯一的id,即使视图中的数据已更改

Oracle 为视图创建持久且唯一的id,即使视图中的数据已更改,oracle,oracle11g,Oracle,Oracle11g,基于这个问题: 假设我有以下数据 -- table CREATE TABLE internal_subject ( id number(10) NOT NULL, sub_name varchar2(400) NOT NULL ); CREATE TABLE external_subject ( id number(10) NOT NULL, sub_name varchar2(400) NOT NULL ); -- data INSERT INTO external

基于这个问题:

假设我有以下数据

-- table
CREATE TABLE internal_subject
( 
  id number(10) NOT NULL,
  sub_name varchar2(400) NOT NULL
);


CREATE TABLE external_subject
( 
  id number(10) NOT NULL,
  sub_name varchar2(400) NOT NULL
);


-- data
INSERT INTO external_subject
(id, sub_name)
VALUES
(1, 'A');

INSERT INTO external_subject
(id, sub_name)
VALUES
(2, 'B');


INSERT INTO internal_subject
(id, sub_name)
VALUES
(1, 'C');

INSERT INTO internal_subject
(id, sub_name)
VALUES
(2, 'D');



-- Create a view 
SELECT 
  rownum, 
  t.sub_name
FROM 
(
  select
    ext_sub.sub_name as sub_name
  from
    external_subject ext_sub

  UNION ALL  

  select
    ext_sub.sub_name as sub_name
  from
    internal_subject ext_sub
) t
select语句将为视图提供1 A、2 B、3 C和4 D

现在,内部主题和外部主题中的数据发生了变化

假设在internal_subject表的开头插入了2个新行数据(E,F)

Change data
--------------------------------
-- table
CREATE TABLE internal_subject
( 
  id number(10) NOT NULL,
  sub_name varchar2(400) NOT NULL
);


CREATE TABLE external_subject
( 
  id number(10) NOT NULL,
  sub_name varchar2(400) NOT NULL
);


-- data
-- old 1, new 1
INSERT INTO external_subject
(id, sub_name)
VALUES
(1, 'E');

-- old 2, new 2
INSERT INTO external_subject
(id, sub_name)
VALUES
(2, 'F');

-- old '', new 5
INSERT INTO external_subject
(id, sub_name)
VALUES
(1, 'A');

-- old '', new 6
INSERT INTO external_subject
(id, sub_name)
VALUES
(2, 'B');


-- old 3, new 3
INSERT INTO internal_subject
(id, sub_name)
VALUES
(1, 'C');

-- old 4, new 4
INSERT INTO internal_subject
(id, sub_name)
VALUES
(2, 'D');



pull after change
--------
-- Test 
SELECT 
  rownum, 
  t.sub_name
FROM 
(
  select
    ext_sub.sub_name as sub_name
  from
    external_subject ext_sub

  UNION ALL  

  select
    ext_sub.sub_name as sub_name
  from
    internal_subject ext_sub
) t
选择给了我1e,2f,3a,4b,5c6d

这是为视图中的行生成唯一且持久的id的一种方法吗?

您可以尝试使用 如果允许的话

在内部主题/外部主题中插入新行时,应使用以下代码:

INSERT INTO internal_subject
(id, sub_name)
VALUES
(yourSequence.nextval, 'X');

-- Create a view  
CREATE VIEW MyView AS
  select id, sub_name from external_subject
  UNION ALL  
  select id, sub_name from internal_subject

是否有任何原因使您不能对
id
列设置唯一约束?
ROWNUM
在获取行后被分配给行,并且不能依赖ROWNUM为您指定顺序。如果希望获得所需的a、B、C、D、E、F顺序,可以使用(按子名称排序)上的
行编号()
而不是rownum。但不清楚行的唯一和持久id是什么意思。我想您可以使用哈希函数(
ora\u hash()
标准\u hash()
)从数据生成确定性id,如果这就是您所说的行的唯一和持久id的意思……但是如果唯一id必须反映唯一的
sub\u名称
,那么为什么不将
sub\u名称
作为id呢?