2011-01-12 6 views
0

Mögliche Duplizieren:
adding primary key to sql viewWie füge ich einen Primärschlüssel zu einer Oracle-Ansicht hinzu?

Ich arbeite mit einer Software, die einen Primärschlüssel in einer Oracle-Ansicht erfordert. Es ist möglich, einen Primärschlüssel in einer Oracle-Ansicht hinzuzufügen? Wenn ja, wie? Ich kann keine Informationen darüber googlen.

+1

Das ergibt keinen Sinn. Eine View enthält keine Daten, sie enthält keine Indizes oder Schlüssel. – skaffman

+0

Materialisierte Ansichten können einen Primärschlüssel haben, aber ich weiß nicht, ob Sie das verwenden möchten. –

+1

Laut UNNIs Kommentar ist es möglich, einer Ansicht eine deaktivierte Primärschlüsselbedingung (oder eine andere Art von Einschränkung) hinzuzufügen. Es kann getan werden, um dem Optimierer Informationen bereitzustellen. Siehe http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96590/adg05itg.htm und suchen Sie nach "Einschränkungen für Ansichten". –

Antwort

2

Das einzige, was in meinem Kopf kommt eine materialisierte Ansicht verwendet, und erstellen Sie dann einen eindeutigen Index auf es: vielleicht

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 

Während dies nützlich sein, muss sie im Auge behalten werden, dass die Ansicht materialisiert, im Gegensatz zu einer "normalen" Ansicht belegt Platz in einem Tablespace. Und natürlich braucht der Index auch Platz.

2

Der SQL-Standard erlaubt leider nur UNIQUE- und PRIMARY KEY-Einschränkungen für Basistabellen, nicht für Views. Oracle lässt eindeutige Indizes für materialisierte Ansichten zu, nicht jedoch generell für Ansichten.

+5

Es ermöglicht sie, aber nur in einem deaktivierten Zustand. Sie stellen Informationen für den Optimierer bereit, können jedoch nicht erzwungen werden. –

+0

Genau was Tony gesagt hat. Und einige Tools, die eine objektrelationale Zuordnung durchführen, möchten, dass diese deaktivierten Primär- und Fremdschlüssel für Ansichten existieren, oder sie erzeugen schreckliche Ausführungspläne. Wir hatten diese Erfahrung mit einer der Versionen von Hibernate, erinnere mich nicht an welche. –

-4

Auf diese Weise können Sie in Ihrer Ansicht einen Primärschlüssel hinzufügen.

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

Wenn das OP sagt "Primärschlüssel", ich vermute, dass sie "Primärschlüssel * Constraint *" bedeuten. Außerdem ist ROWNUM nicht garantiert, dass es bei jeder Ausführung der Abfrage identisch ist, daher ist es nicht als primärer Ersatzschlüssel geeignet. Selbst wenn Sie davon ausgehen, dass die Tabelle niemals Einfügungen oder Löschungen erhält. –

+0

@ Jeffrey Kemp Ich stimme dir vollkommen zu, dass ROWNUM nicht garantiert ist, aber man kann immer Primary-Constraint machen, indem man den Befehl 'alter view VU_NAME add constraint vemp_pk Primärschlüssel (PRIMARY_KEY) disable' benutzt. Meine Frage blieb immer noch unbeantwortet: Warum will er aus seiner Sicht einen Primärschlüssel haben? –