0

Ich habe Tabellen mit ang1 und EMP2Primärschlüssel mit zwei Spalten in Oracle?

ang1:

emp_1 | emp_2 
1  | 2 
3  | 4 
5  | 6 

EMP2:

emp 
1 
2 
3 
6 

I Primärschlüssel Tabelle ang1 und Fremdschlüssel zu EMP2 zu setzen versucht.

Mein Code:

Für Primärschlüssel:

alter table emp1 add primary key(emp_1,emp_2); 

Für Fremdschlüssel:

alter table emp2 
add foreign key (emp) 
references a_t1(emp_1,emp_2); 

Fehler:

Error report - 
SQL Error: ORA-02256: number of referencing columns must match referenced  columns 
02256. 00000 - "number of referencing columns must match referenced columns" 
*Cause: The number of columns in the foreign-key referencing list is not 
     equal to the number of columns in the referenced list. 
*Action: Make sure that the referencing columns match the referenced 
     columns. 

bitte mir helfen, diesen Fehler zu lösen und Stellen Sie den Primärschlüssel ein.

+0

Sie versuchen, einen Fremdschlüssel aus einem Feld zu zwei Feldern hinzuzufügen; Sie müssen entscheiden, ob die Werte in der Tabelle EMP2 mit den Datensätzen in der Spalte emp_1 ODER emp_2 aus der Tabelle EMP1 übereinstimmen müssen. – Aleksej

+1

Sie können nicht festlegen, dass sich ein FK auf einen Teil einer zusammengesetzten PK oder einen von zwei separaten Schlüsseln bezieht (PK oder UK). Was würden Sie erwarten, wenn Sie sagen würden, Sie hätten Zeilen in emp1 mit Werten (7,8) und Werten (8,9) und wollten eine Zeile in emp2 mit Wert (8)? Auf welche Zeile im Elternteil würde sich das beziehen? –

+0

yeh ich habe es. Ich habe versucht, einen zusammengesetzten Primärschlüssel zu erstellen. – user5505661

Antwort

1

Der einzige Weg, wie ich es mir vorstellen kann, ist ein böser Hack, der eine materialisierte Ansicht beinhaltet. Es wäre besser, Ihre Daten so zu korrigieren, dass der Primärschlüssel nicht über zwei Spalten verteilt ist.

CREATE TABLE EMP1 (
    EMP_1 INT UNIQUE, 
    EMP_2 INT UNIQUE, 
    PRIMARY KEY (EMP_1,EMP_2) 
); 

CREATE MATERIALIZED VIEW LOG ON EMP1 
    WITH SEQUENCE, ROWID(EMP_1, EMP_2) 
    INCLUDING NEW VALUES; 

CREATE MATERIALIZED VIEW EMP1_MV 
    BUILD IMMEDIATE 
    REFRESH FAST ON COMMIT 
    AS SELECT EMP_1 AS EMP 
     FROM EMP1 
     UNION ALL 
     SELECT EMP_2 
     FROM EMP1; 

ALTER TABLE EMP1_MV ADD CONSTRAINT EMP1_MV__PK PRIMARY KEY (EMP); 

CREATE TABLE EMP2 (
    EMP INT PRIMARY KEY REFERENCES EMP1_MV(EMP) 
); 
+0

Danke U. Ich habe das Konzept. Ich werde es mit materialisierter Sicht versuchen. – user5505661