2016-05-02 4 views
0

私は、このデータベースからPLSQLで作成しようとしているクエリを書いているプロジェクトに取り組んでいます。しかし、私はそれを行う前に、私はdbを作成する必要があり、私が実行しようとしているテーブル作成statemensのいくつかはエラーを返すです。特に、エラーは、私が参照している主キーのいくつかが存在しないことを示しているようです。それが真実かどうかを確認するとき、私はその可能性のある問題を見ます。例えば、私はCourse_Interest_groupの主キー(interest_gid)への外部キーを設定「SQLエラー:ORA-02270:この列リストに一致する固有キーまたは主キーがありません」というエラーを修正するにはどうしたらいいですか?

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) 
) 

をしよう。

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) 
); 

Course_Interest_groupの主キーだけでinterest_gidではなく、interest_gid、courseid、およびfacultyid:
しかし、Course_Interest_groupはこれです。
同じ問題のいくつかの他のインスタンスがあります。
私の質問は、Course_Interest_groupを参照するとき、私はどのようにinterest_gidを参照することができますか?出来ますか?私は何かを変えるべきですか?

(interest_gid、courseid、facultyid)の現在のCourse_Interest_group pkをそのまま維持したいと思いますが、必要に応じて修正します。

my code

my output

+0

3つの列を一意に宣言する必要があり、1つの数値列である合成主キーが必要です。 –

+0

私は合成主キーが何であるか完全には分かっていません。あなたの答えを詳しく説明できますか、おそらく例を提供したりリンクしたりできますか? – Codarus

+0

ID列を追加して(通常はシーケンスを使用して)、各行に一意の整数を割り当てます。 –

答えて

0

course_interest_groupテーブルに表の各行を一意に識別し、次いでinterest_gid主キーであるべきであるinterest_gid場合。同様に、group_disforumでは、df_idがテーブルの各行を一意に識別する場合、df_idが主キーでなければなりません。両方のテーブルの主キーを変更することで、この問題を解決する必要があります。

0

あなたの質問には、データの整合性をカスタマイズするためのトリガになると思います。前のINSERTトリガーを作成して、ケースのデータ(Course_Interest_group(interest_gid))が最初にチェックされます。あなたのトリガーの基本的な構造はそうです。これはワークワイドかもしれないことを願っています。

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; 
/
関連する問題