2016-05-02 4 views
0

Ich arbeite an einem Projekt, in dem ich Abfragen aus dieser Datenbank schreibe, die ich in PLSQL erstellen möchte. Bevor ich das jedoch tun kann, muss ich die Datenbank erstellen, und einige der Tabellenerstellungsstatements, die ich ausführen möchte, geben Fehler zurück. Insbesondere scheinen die Fehler darauf hinzuweisen, dass einige der Primärschlüssel, auf die ich referenziere, nicht existieren. Wenn ich nachschaue, ob das stimmt, sehe ich das wahrscheinliche Problem. Zum Beispiel versuche ichWie korrigiere ich "SQL-Fehler: ORA-02270: kein übereinstimmender eindeutiger oder Primärschlüssel für diese Spaltenliste" Fehler?

create table group_disforum (df_id int, 
ig_id int, 
constraint gdf_FK foreign key(ig_id) references Course_Interest_group(interest_gid), 
constraint gdf_PK primary key(df_id, ig_id), 
comments varchar(150) 
) 

Einstellung den Fremdschlüssels für den Primärschlüssel (interest_gid) in Course_Interest_group zu tun.
Allerdings ist die Course_Interest_group dies:

create table Course_Interest_group(interest_gid int, 
gname varchar(20), 
courseid int, 
facultyid int, 
past_gpa float, 
constraint IG_PK primary key(interest_gid, courseid, facultyid), 
constraint IG_FK1 foreign key(courseid) references course(courseid), 
constraint IG_FK2 foreign key(facultyid) references User_Faculty(userid) 
); 

Der Primärschlüssel für Course_Interest_group nicht nur interest_gid, aber interest_gid, courseid und facultyid.
Es gibt mehrere andere Instanzen des gleichen Problems.
Meine Frage ist, wenn ich Course_Interest_group referenziere, wie kann ich nur interest_gid referenzieren? Ist es möglich? Sollte ich etwas ändern?

Ich möchte die aktuelle Course_Interest_group pk von (interest_gid, courseid, facectizid) intakt, aber ich werde es bei Bedarf ändern.

my code

my output

+0

Es klingt, als sollten die drei Spalten für eindeutig erklärt werden und Sie sollten einen synthetischen Primärschlüssel haben, der eine einzelne numerische Spalte ist. –

+0

Ok. Ich bin mir nicht ganz sicher, was ein synthetischer Primärschlüssel ist. Könnten Sie Ihre Antwort näher erläutern, indem Sie vielleicht ein Beispiel geben oder verlinken? – Codarus

+0

Fügen Sie eine Identitätsspalte hinzu (in der Regel mithilfe einer Sequenz), um jeder Zeile eine eindeutige ganze Zahl zuzuweisen. –

Antwort

0

Wenn in der Tabelle identifiziert course_interest_group in der Tabelle eindeutig jede Zeile interest_gid dann sollten interest_gid der Primärschlüssel sein. Wenn df_id im group_disforum eindeutig jede Zeile in der Tabelle identifiziert, sollte df_id der Primärschlüssel sein. Das Ändern der Primärschlüssel beider Tabellen sollte das Problem beheben.

0

Ich denke, der Weg herum für Ihre Frage wird ein TRIGGER sein, um die Datenintegrität anzupassen. Sie können einen before INSERT-Trigger erstellen, der zuerst prüft, ob die Daten in Ihrem Fall (Course_Interest_group (interest_gid)) sind. So wird die Grundstruktur Ihres Triggers aussehen. Hoffe, dass dies ein Workwround sein kann.

SET SQLBL ON; 
SET DEFINE OFF; 
CREATE OR REPLACE TRIGGER group_disforum_tg BEFORE 
    INSERT OR 
    UPDATE 
    /*OF ig_id*/ 
    ON group_disforum FOR EACH ROW 
    DECLARE lv_chck PLS_INTEGER; 
    BEGIN 
    SELECT COUNT(1) 
    INTO lv_chck 
    FROM Course_Interest_group 
    WHERE interest_gid = :new.interest_gid; 
    IF lv_chck   = 0 THEN 
     RAISE_APPLICATION_ERROR(-20001,'Parent key (interest_gid) not found in group_disforum_tg',TRUE); 
    END IF; 
    END; 
/
Verwandte Themen