比较不同表中的两个值 - MySql

Compare two values from different tables - MySql

我需要在插入(学术报告)的'year'列之前检查它是否不小于(学生)

的'enrollment date'列的年份

我的表:

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

提前致谢。

好的,我为您要生成错误的条件创建了一个 select 语句。如果此报告存在学生并且报告年份小于学生入学日期,它将为 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;

我找到问题了:)

这个说法是完全错误的,

 YEAR(num.Enrollment_Date)

因为写attribute.attribute不对,只能用Table.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 ;