【发布时间】:2018-01-25 01:23:25
【问题描述】:
基于这个问题:Oracle: Create a View with Auto Increment id column
假设我有以下数据
-- 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 和 external_subject 中的数据已更改。
说在 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
选择给我 1 E、2 F、3 A、4 B、5 C 6 D。
这是一种为视图中的行生成唯一且持久的 id 的方法吗?
【问题讨论】:
-
您是否有任何理由不能对
id列设置唯一约束? -
ROWNUM在获取行后分配给行,并且不能依赖 ROWNUM 为您提供指定的顺序。如果您想要 A、B、C、D、E、F 的所需顺序,您可以使用row_number() OVER ( ORDER BY sub_name )而不是 rownum。但不清楚行的唯一且持久的 id 是什么意思。 -
我想您可以使用散列函数(
ora_hash()、standard_hash())从数据中生成确定性 ID,如果这就是您所说的行的唯一且持久的 ID。 -
...但是,如果唯一 ID 必须反映唯一的
sub_name,那么为什么不直接将sub_name设为 ID?