2016-03-23 29 views
2

特定の制限を持つテーブルを作成しようとしていますが、トリガーを使用することはできません。FK関係に基づく制約テーブル

私はOracle SQLを使用しています。

制限は以下のとおりです。

  1. のみ1クラスコースのIDあたり
  2. 学生は4コースの最大を許可1 BE教えて25人の学生
  3. 各コースの最大許可
  4. コースインストラクター
  5. 各学生のみ1つのメジャー

太字 2と3は問題があります。

CREATE TABLE STUDENT(
    STUDENT_ID NUMERIC(9), 
    STUDENT_NAME VARCHAR(32) NOT NULL, 
    STUDENT_ADDRESS VARCHAR(50), 
    MAJOR VARCHAR(4), 
    CONSTRAINT student_id_pk PRIMARY KEY(STUDENT_ID) 
); 

CREATE TABLE COURSE(
    COURSE_ID VARCHAR(6), 
    COURSE_TITLE VARCHAR(32) NOT NULL, 
    INSTRUCTOR_ID NUMERIC(3) UNIQUE, 
    CONSTRAINT course_id_pk PRIMARY KEY(COURSE_ID), 
    CONSTRAINT instructor_id_fk FOREIGN KEY (INSTRUCTOR_ID) REFERENCES INSTRUCTOR(INSTRUCTOR_ID) 
); 

CREATE TABLE INSTRUCTOR(
    INSTRUCTOR_ID NUMERIC(3), 
    INSTRUCTOR_NAME VARCHAR(50) NOT NULL, 
    INSTRUCTOR_OFFICE VARCHAR(4), 
    CONSTRAINT instructor_id_pk PRIMARY KEY(INSTRUCTOR_ID) 
); 

CREATE TABLE STU_CRSE(
    STUDENT_ID NUMERIC (9), 
    COURSE_ID VARCHAR(6), 
    GRADE CHAR(1), 
    CONSTRAINT grade_range CHECK(GRADE IN ('A','B','C','D','F')), 
    CONSTRAINT stu_crs_pk PRIMARY KEY (STUDENT_ID,COURSE_ID), 
    CONSTRAINT crs_fk FOREIGN KEY (COURSE_ID) REFERENCES COURSE(COURSE_ID), 
    CONSTRAINT str_fk FOREIGN KEY (STUDENT_ID) REFERENCES STUDENT(STUDENT_ID), 
-- 
--Below are the constraints I'm having trouble with. 
-- 
    CONSTRAINT stu_limit CHECK (COUNT(STU_CRSE.STUDENT_ID)<5), 
    CONSTRAINT stu_crse_limit CHECK (count(STU_CRSE.STUDENT_ID,STU_CRSE.COURSE_ID)<26) 
); 
+0

ながら、 rdbmsの理論は一般的な答えを許すでしょう、実践はすべてが平等ではないということを私に任せました。通常、mysqlにはまだチェック制約はありません。あなたのエンジンをより良い解決策に指定してください。 – Sebas

+0

私はOracle SQL – NonCreature0714

+0

トリガを使用しているか、制約をチェックするカスタム挿入プロシージャを記述しています。 – Rocki

答えて

3

あなたが試すことができます。

CREATE MATERIALIZED VIEW LOG ON STU_CRSE 
    WITH SEQUENCE, ROWID(course_id, student_id) 
    INCLUDING NEW VALUES; 

CREATE MATERIALIZED VIEW STU_CRSE__NUM_STUDENTS__MV 
    BUILD IMMEDIATE 
    REFRESH FAST ON COMMIT 
    AS SELECT COURSE_ID, 
      COUNT(STUDENT_ID) AS num_students 
     FROM STU_CRSE 
     GROUP BY COURSE_ID; 

ALTER TABLE STU_CRSE__NUM_STUDENTS__MV 
    ADD CONSTRAINT STU_CRSE__NUM_STU__MV__COUNT CHECK (num_students <= 25); 

CREATE MATERIALIZED VIEW STU_CRSE__NUM_COURSES__MV 
    BUILD IMMEDIATE 
    REFRESH FAST ON COMMIT 
    AS SELECT STUDENT_ID, 
      COUNT(COURSE_ID) AS num_courses 
     FROM STU_CRSE 
     GROUP BY STUDENT_ID; 

ALTER TABLE STU_CRSE__NUM_COURSES__MV 
    ADD CONSTRAINT STU_CRSE__NUM_CRS__MV__COUNT CHECK (num_courses <= 4); 

をテスト

INSERT INTO STU_CRSE 
SELECT 1, LEVEL, 'A' FROM DUAL CONNECT BY LEVEL <= 4; 

4 rows inserted. 

COMMIT; 

Commit complete. 

INSERT INTO STU_CRSE VALUES (1, 5, 'A'); 

1 row inserted. 

COMMIT; 

Error report - 
SQL Error: ORA-12048: error encountered while refreshing materialized view "TEST"."STU_CRSE__NUM_COURSES__MV" 
ORA-02290: check constraint (TEST.STU_CRSE__NUM_CRS__MV__COUNT) violated 
0

制約を作るための簡単な解決策は以下のとおりです。

は整数STUDENT_LFDNRとCOURSE_LFDNRが

は(STUDENT_ID、STUDENT_LFDNR)にユニークなキーを追加STU_CRSEに追加、(Course_IDに、COURSE_LFDNR)

constadintをSTUDENT_LFDNRに追加する(> 0 & < = 4)

制約を追加するON C OURSE_LFDNR(> 0 & < = 25)

しかし、これで作業はpainfullになります...

関連する問題