1

コース、学生、登録などのテーブルを含む学校を表すデータベースがあります。次のスキーマがあります。

CREATE TABLE Students(
id INT CHECK(id > 100000),
lName CHAR(20),
fName CHAR(10),
gender CHAR(1) CHECK(gender IN('F','M')),
dob DATE,
address CHAR(100),
phone INT CHECK(phone > 1000000000),
grade CHAR(1) CHECK(grade IN('K','1','2','3','4','5')),
PRIMARY KEY(id));

CREATE TABLE Courses(
id INT CHECK(id > 1000),
name CHAR(40),
grade CHAR(1) CHECK(grade IN('K','1','2','3','4','5')),
PRIMARY KEY(id)
);

CREATE TABLE Enrollment(
studentID INT REFERENCES Students(id),
courseID INT REFERENCES Courses(id),
semester CHAR(6) CHECK(semester IN('Fall','Spring')),
year INT,
letterGrade CHAR(1) CHECK(letterGrade IN('A','B','C','D','E')),
PRIMARY KEY(studentID,courseID,semester,year));

タプルが挿入される前に、指定された StudentID を持つ学生の学年レベルと courseID を持つコースの学年レベルが等しいことを確認する、登録テーブルのトリガーを作成したいと考えています。私はしばらくこれに取り組んできましたが、うまくいかないようです。誰かが私を正しい方向に向けることができますか? これは私が思いついたものです:

CREATE TRIGGER appropriateLevel
   ...> BEFORE INSERT ON Enrollment
   ...> FOR EACH ROW
   ...> BEGIN
   ...> SELECT RAISE(ABORT,'The student's grade does not match the grade level of the course.')
   ...> WHERE EXISTS(SELECT * FROM Students, Courses WHERE ((Students.grade = Courses.grade) AND (Students.id = NEW.studentID) AND (Courses.id = NEW.courseID)));
   ...> END;

ありがとう!

4

1 に答える 1

1

成績が一致すると、トリガーは中止されます。

EXISTSとにかく、各親テーブルから特定の値を 1 つだけ比較したいので、使用する必要はありません。

CREATE TRIGGER appropriateLevel
BEFORE INSERT ON Enrollment
FOR EACH ROW
BEGIN
    SELECT RAISE(ABORT, 'The student''s grade does not match the course''s grade level.')
    WHERE (SELECT grade FROM Students WHERE id = NEW.studentID) <>
          (SELECT grade FROM Courses  WHERE id = NEW.courseID);
END;
于 2013-04-14T11:10:42.467 に答える