2011-01-12 2 views
0

Можно создать дубликат:
adding primary key to sql viewКак добавить первичный ключ в представлении Oracle?

Я работаю с программным обеспечением, которое требует первичного ключа в целях Oracle. Можно добавить первичный ключ в представлении Oracle? Если да, то как? Я не могу сообщить об этом в Google.

+1

Это не имеет смысла. A View не содержит данных, он не имеет индексов или ключей. – skaffman

+0

Материализованные представления могут иметь первичный ключ, но я не знаю, если это то, что вы хотите использовать? –

+1

Согласно комментарию UNNI, к представлению можно добавить отключенный первичный ключ (или другой вид). Это можно сделать, чтобы предоставить информацию оптимизатору. См. Http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96590/adg05itg.htm и найдите «ограничения на представления». –

ответ

2

Единственное, что приходит на мой взгляд, использует материализованное представление, а затем создать уникальный индекс на нем:

drop materialized view tq84_mat_view; 
drop table tq84_table; 
create table tq84_table (
    a number, 
    b number 
); 

create materialized view tq84_mat_view 
refresh on commit as 
select 
    a, 
    sum(b) sum_b 
from 
    tq84_table 
group by 
    a; 

create unique index tq84_mat_view_uix on tq84_mat_view (sum_b); 

insert into tq84_table values (1, 1); 
insert into tq84_table values (2, 2); 
insert into tq84_table values (1, 4); 

commit; 

insert into tq84_table values (2, 3); 

commit; 
--> ORA-12008: error in materialized view refresh path 
--> ORA-00001: unique constraint (SPEZMDBA.TQ84_MAT_VIEW_UIX) violated 

Хотя это может быть полезным, следует иметь в виду, что материализованное представление, в отличие от «нормального» представления занимает пространство в табличном пространстве. И, конечно, индекс тоже нуждается в пространстве.

2

Стандарт SQL, к сожалению, допускает ограничения UNIQUE и PRIMARY KEY для базовых таблиц, а не представлений. Oracle разрешает уникальные индексы на материализованных представлениях, но не на представлениях вообще.

+5

Это позволяет им, но только в отключенном состоянии. Они предоставляют информацию оптимизатору, но не могут применяться. –

+0

Именно то, что сказал Тони. И некоторые инструменты, которые выполняют объектно-реляционное сопоставление, хотят, чтобы у всех отключенных первичных и внешних ключей существовали представления, или они генерируют ужасные планы выполнения. У нас был этот опыт с одной из версий Hibernate, не помните, какой из них. –

-4

Это способ, которым вы можете добавить первичный ключ в свой вид.

CREATE OR REPLACE FORCE VIEW VU_NAME 
     (
      PRIMARY_KEY, NAME_ID, ADDRESS_ID 
     ) 
     AS 
     SELECT DISTINCT ROWNUM AS PRIMARY_KEY, 
      NAME.ID UNIT_ID, 
      ADDRESS_ID 
     from table1; 
+1

Когда ОП говорит «Первичный ключ», я подозреваю, что они означают «Первичный ключ * Ограничение *». Кроме того, ROWNUM не гарантируется одинаковым при каждом запуске запроса, поэтому он не подходит в качестве суррогатного Первичного ключа; даже если вы сделаете предположение, что таблица никогда не получит вставки или удаляет. –

+0

@Jeffrey Kemp Я полностью согласен с вами в том, что ROWNUM не гарантируется, но всегда можно сделать ограничение Primary, используя эту команду 'alter view VU_NAME добавить ограничение vemp_pk primary key (PRIMARY_KEY) disable'. Тем не менее мой вопрос остался без ответа, что ** почему он хочет иметь первичный ключ в его представлении ** –

Смежные вопросы