比较不同表中的两个值-MySql
在插入学术报告的“年份”栏之前,我需要检查是否不少于学生报告中“入学日期”栏的年份 我的桌子:比较不同表中的两个值-MySql,mysql,sql,mysql-workbench,workbench,Mysql,Sql,Mysql Workbench,Workbench,在插入学术报告的“年份”栏之前,我需要检查是否不少于学生报告中“入学日期”栏的年份 我的桌子: 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
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 ;
我该怎么做呢
使用MySql workbench 6.3
提前感谢。好的,我为您要生成错误的条件创建了一个select语句。如果此报告的学生存在,且报告年度小于学生注册日期,则将为select查询生成一行或多行。继续查找的行将大于0,这将触发错误消息
我已经解决了问题: 这个说法是完全错误的,
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 ;
您可能需要使用触发器执行此操作。请参阅new是对基础触发器表的传入行值的引用。您需要从学生中进行选择,以获得您可以比较的值。感谢您抽出时间。您的代码在create trigger语句期间产生此错误。错误代码:1415。不允许从触发器返回结果集
YEAR(num.Enrollment_Date)
/* 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 ;