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呢?