2013-04-14 1 views
1

У меня есть база данных, представляющая школу с такими таблицами, как курсы, студенты и зачисление. Они имеют следующие схемы:sqlite триггер, проверяющий равенство новых значений кортежа с подзапросами

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; 

Спасибо!

ответ

2

Ваш спусковой крючок прерывается, когда совпадают оценки.

В любом случае, вам не нужно использовать EXISTS, потому что вы хотите сравнить только одно конкретное значение из каждой родительской таблицы:

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; 
+1

Еще раз спасибо за вашу помощь CL –

Смежные вопросы