2016-09-21 4 views
0

Dies ist die Tabelle, die ich erstellen möchte. Allerdings bekomme ich den FehlerTabelle kann nicht erstellt werden. SQL-Fehler 02270

SQL Error: ORA-02270: no matching unique or primary key for this column-list

SQL:

create table Meets_In 
(
    cid char(20), 
    rno integer, 
    time char(20), 
    CONSTRAINT PRIM_KEY PRIMARY KEY(time), 
    constraint meets_fk1 foreign key(cid) references COURSES(CID), 
    constraint meets_fk2 foreign key(rno) references ROOMS(RNO) 
); 

Dies sind die übergeordneten Tabellen:

create table Courses 
(
    cid char(20), 
    cname char(20), 
    credits integer, 
    constraint CoursesKey Primary Key (cid, cname) 
); 

CREATE TABLE ROOMS 
(
    rno INTEGER, 
    address CHAR(20), 
    capacity INTEGER, 
    CONSTRAINT room_key PRIMARY KEY(rno) 
); 

Ich verstehe nicht, warum ich diese Störung erhalte.

+0

Könnte sein, weil 'Zeit' ist ein reserviertes Wort in (einigen Versionen von) SQL. Sie könnten versuchen, es umzubenennen. – dave

+0

Versuchte es, und es hat nicht funktioniert. Ich bekomme den gleichen Fehler. –

+0

Warum müssen Sie 'cname' in den Primärschlüssel einbeziehen, um' courses' zu erstellen? Ist "cid" nicht bereits eine eindeutige Kennung? (Und wenn nicht, warum nicht?) – mathguy

Antwort

2

Cause

Die ORA-2270, wie die Fehlermeldung schon sagt, geschieht, wenn es no matching unique or primary key for this column-list ist. Dies könnte daran liegen

  • die Eltern eine Einschränkung gänzlich fehlt
  • die Einschränkung der Elterntabelle ist eine Verbindung, Schlüssel und wir haben nicht alle Spalten in der Fremdschlüssel Anweisung verwiesen.

Jetzt in Ihrer COURSES Tabelle ist CID keine primary key. Es ist eine Kombination von cid,cname. Für jede cid kann es mehrere Zeilen geben.

Wenn Sie jetzt cid als Fremdschlüssel für meets_in verweisen, wird es nicht funktionieren, da sie den zweiten Punkt verletzt, wie ich oben erwähnt.

Workaround

hinzufügen Spalte cname in Ihrem meets_in Tabelle auch. Dann benutze es wie unten.

create table Meets_In 
(
    cid char(20) not null, 
     cname char(20), 
    rno integer not null, 
    time1 char(20) not null, 
    CONSTRAINT PRIM_KEY PRIMARY KEY(time1), 
    constraint meets_fk1 foreign key(cid,cname) references COURSES (cid,cname), /*Added cid,cname */ 
    constraint meets_fk2 foreign key(rno) references ROOMS (RNO) 
); 
+0

Also, wie würde ich gehen über die Verweisung 'cid, cname' in der Tabelle' Meet_in' wenn ich nur 'cid' brauche? Ist das möglich? –

+0

Warum hat 'cname' nicht' not null'? –

+0

Ich denke, die bessere Lösung ist, 'cname' aus dem PK zu entfernen -' cid' allein sollte ausreichen. Wenn nicht, ist das ein separates Problem, das behoben werden sollte. – mathguy

1

Meets_In fungiert als eine assoziative Tabelle. Daher sollte der Primärschlüssel die Fremdschlüssel in die Tabellen einschließen, die er verknüpft.

Versuchen einen Primärschlüssel, bestehend aus: cid, cname, rno und time.

Wie bereits erwähnt, ist Ihr Primärschlüssel für courses(cid, cname), daher müssen Sie auch beide in Ihre Fremdschlüsseleinschränkung meets_fk1 einbeziehen. Oder, wenn möglich, stellen Sie sicher, dass cid nur der Primärschlüssel unter courses ist.

(glaube ich time ein reserviertes Wort sein kann, vielleicht halten es für die Umbenennung.)

+0

'Zeit' ist kein reserviertes Wort in Oracle: http://docs.oracle.com/cd/B28359_01/appdev.111/b31231/appb.htm Im Allgemeinen obwohl das Es ist ein gutes Anliegen, immer daran zu denken. – mathguy

Verwandte Themen