【问题标题】:Create persistent and unique id for a view, even data in view is changed为视图创建持久且唯一的 id,即使视图中的数据发生更改
【发布时间】: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?

标签: oracle oracle11g


【解决方案1】:

你可以试试 sequence 如果允许的话..

当您在 internal_subject/external_subject 中插入新行时,您应该使用以下代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 2020-03-08
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多