2015-11-20 5 views
2

мне нужно проверить перед вставкой в ​​колонку «года» из (академического доклада), что это не менее года «дата регистрации» колонок в (студенте)Сравнение двух значений из разных таблиц - MySql

моих таблиц :

CREATE TABLE STUDENT 
(
BCN INT (10) , 
Enrollment_Date timestamp not null default CURRENT_TIMESTAMP, 
primary key (BCN),   
); 


CREATE TABLE ACADEMIC_REPORT 
( 
    Stud_Num INT(10) , 
    Year year , 
    primary key (Stud_Num , Year), 

    foreign key (Stud_Num) references STUDENT(BCN) 
    ON DELETE restrict  ON UPDATE CASCADE 
); 

Я стараюсь это:

/* ACADEMIC_REPORT._Year Constraint "BEFORE INSERT" */ 
delimiter //  
CREATE TRIGGER ReportYearBIN BEFORE INSERT ON ACADEMIC_REPORT 
FOR EACH ROW 
BEGIN 
    declare num int(10); 
    SET num= (SELECT BCN 
      FROM STUDENT , ACADEMIC_REPORT 
      WHERE BCN = ACADEMIC_REPORT.Stud_Num); 

     IF (ACADEMIC_REPORT.Year < YEAR(num.Enrollment_Date)) 
     THEN 
    SIGNAL SQLSTATE '10000' 
     SET MESSAGE_TEXT = 'Error....!'; 
    END IF; 
END; 
// delimiter ; 

но вызывает эту ошибку во время вставки

Error Code: 1054. Unknown column 'ACADEMIC_REPORT.Year' in 'field list' 

Как я могу сделать это ограничение?

Использование MySQL Workbench 6.3

Спасибо заранее.

+2

вам, возможно, придется сделать это с помощью триггеров см http://dba.stackexchange.com/questions/9662/check-constraint-does-not-work – FuzzyTree

+1

' new' является ссылкой на значения входящей строки для базовой таблицы триггеров. Вам нужно «SELECT» от ученика, чтобы получить значения, с которыми вы можете сравнивать. – JRD

ответ

0

Я понял, проблема :)

Это утверждение абсолютно неверно,

YEAR(num.Enrollment_Date) 

, потому что это не правильно писать attribute.attribute, вы можете использовать только таблицу .Атрибут.

Итак, вот решение

/* ACADEMIC_REPORT._Year Constraint "BEFORE INSERT" */ 
delimiter //  
CREATE TRIGGER ReportYearBIN BEFORE INSERT ON ACADEMIC_REPORT 
FOR EACH ROW 
BEGIN 
    declare Enroll timestamp; 
    SET Enroll = (SELECT Enrollment_Date 
       FROM STUDENT 
       WHERE BCN = new.Stud_Num); 

     IF (new._year < YEAR(Enroll)) 
     THEN 
    SIGNAL SQLSTATE '10000' 
     SET MESSAGE_TEXT = 'Error..The Report year cannot be less than the enrollment year..!'; 
    END IF; 
END; 
// delimiter ; 
0

Хорошо, я создал инструкцию select для условий, в которых вы хотите сгенерировать ошибку. Если студент существует для этого отчета, а отчетный год меньше даты регистрации учащихся, он будет генерировать одну или несколько строк для запроса выбора. Последующее FOUND_ROWS() будет больше 0, которое вызовет ваше сообщение об ошибке.

CREATE TRIGGER ReportYearBIN BEFORE INSERT ON ACADEMIC_REPORT 
FOR EACH ROW 
BEGIN 
    SELECT * FROM STUDENT WHERE BCN=new.Stud_Num AND new._year < Enrollment_Date 
    IF (SELECT FOUND_ROWS() > 0) 
     THEN 
    SIGNAL SQLSTATE '10000' 
     SET MESSAGE_TEXT = 'Error....!'; 
    END IF; 

END; 
+0

Спасибо за ваше время. ваш код создает эту ошибку во время создания инструкции триггера 'Код ошибки: 1415. Не разрешено возвращать результирующий набор из триггера' – user3018340

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