MYSQL 触发插入和更新错误:MySQL 错误 1241:操作数应包含 1 列
MYSQL trigger insertion and updation errors : MySQL error 1241: Operand should contain 1 column(s)
我有 4 张桌子看起来像....
CREATE TABLE `Faculty` (
`FID` varchar(10) NOT NULL,
`Name` varchar(30) NOT NULL,
`DOB` date NOT NULL,
`Sem` varchar(1) NOT NULL,
`Section` varchar(1) NOT NULL,
`Subject Code` varchar(6) NOT NULL,
`Dep` varchar(3) NOT NULL,
`Hours Taken` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `Student` (
`USN` varchar(10) NOT NULL,
`DOB` date NOT NULL,
`Dep` varchar(3) NOT NULL,
`SEM` int(1) NOT NULL,
`Class` varchar(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `Student Attendance` (
`USN` varchar(10) NOT NULL,
`Subject Code` varchar(6) NOT NULL,
`Attendance` int(11) DEFAULT '0',
`Absent Days` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `Subjects` (
`Subject` varchar(40) NOT NULL,
`Subject Code` varchar(6) NOT NULL,
`Dep` varchar(3) NOT NULL,
`Sem` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
现在我需要确保学生 (Student Attendance
.Attendance
) 上课的小时数不超过教员上课的小时数 (Faculty
.Hours Taken
) 对于该特定主题 (Subject Code
)。所以我写了一个触发器来检查是否满足上述条件来检查插入和更新。
如果小时数 (Student Attendance
.Attendance
) 大于我已将 Student Attendance
.Attendance
设置为某个字符串。我希望这可以作为断言并给我一个错误。
CREATE TRIGGER `HoursCheckonInsert` BEFORE INSERT ON `Student
Attendance`
FOR EACH ROW SET NEW.Attendance= IF(
( Select k.USN, s.`Subject Code`,f.`Hours Taken`,s.Attendance
From Faculty f, `Student Attendance` s, Student k
where s.`Subject Code` = f.`Subject Code` AND k.SEM = f.Sem AND k.Class=f.Section AND s.USN=k.USN AND
NEW.Attendance < f.`Hours Taken` OR NEW.Attendance = f.`Hours Taken`
),
NEW.Attendance,
'abcdef'
)
CREATE TRIGGER `HoursCheckonUpdate` BEFORE UPDATE ON `Student Attendance
FOR EACH ROW SET NEW.Attendance= IF(
(Select k.USN, s.`Subject Code`,f.`Hours Taken`,s.Attendance
From Faculty f, `Student Attendance` s, Student k
where NEW.`Subject Code`=f.`Subject Code` AND NEW.USN=k.USN AND
NEW.USN=s.USN AND k.SEM=f.Sem AND k.Class=f.Section AND k.DEP=f.DEP
AND (NEW.Attendance < f.`Hours Taken` OR NEW.Attendance = f.`Hours Taken`)
),
NEW.Attendance,
'abcdef'
)
当我尝试向学生出勤率中插入一个值时,出现此错误:
INSERT INTO `Student Attendance` (`USN`, `Subject Code`, `Attendance`, `Absent Days`) VALUES ('1KS15BT001', '15BT44', '0', '0');
Error:
#1241 - Operand should contain 1 column(s)
我是 MySQL 中的触发器新手。
MySQL 的 IF()
函数需要一个 标量表达式 作为它的第一个参数。标量表达式意味着它必须是一列,最多一行。
您使用的子查询有四列,行数未知。
从您的评论来看,您似乎只对是否有零行或多于零行符合条件感兴趣。你是对的,你 select 是什么列并不重要——如果你使用 EXISTS
谓词来测试子查询而不是在标量表达式中返回子查询的结果。
你应该使用 EXISTS
谓词来做你想做的事情。参见 https://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.html
CREATE TRIGGER `HoursCheckonInsert`
BEFORE INSERT ON `Student Attendance`
FOR EACH ROW
SET NEW.Attendance = IF(
EXISTS(
SELECT *
FROM Faculty AS f
JOIN `Student Attendance` AS s ON s.`Subject Code` = f.`Subject Code`
JOIN Student AS k ON k.SEM = f.Sem AND k.Class=f.Section AND k.uSN = s.USN
WHERE NEW.Attendance <= f.`Hours Taken`),
NEW.Attendance,
'abcdef');
那么您在 select 列表中放入什么列就没有关系了。我在上面显示了使用 SELECT *
。没关系,因为 EXISTS
只检查是否存在任何匹配的行,它根本不会有结果集——只有一个布尔值,表示是否有零行或多于零行。
您还应该使用 JOIN
语法代替过时的逗号式连接语法。我在上面的例子中展示了这一点。
我有 4 张桌子看起来像....
CREATE TABLE `Faculty` (
`FID` varchar(10) NOT NULL,
`Name` varchar(30) NOT NULL,
`DOB` date NOT NULL,
`Sem` varchar(1) NOT NULL,
`Section` varchar(1) NOT NULL,
`Subject Code` varchar(6) NOT NULL,
`Dep` varchar(3) NOT NULL,
`Hours Taken` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `Student` (
`USN` varchar(10) NOT NULL,
`DOB` date NOT NULL,
`Dep` varchar(3) NOT NULL,
`SEM` int(1) NOT NULL,
`Class` varchar(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `Student Attendance` (
`USN` varchar(10) NOT NULL,
`Subject Code` varchar(6) NOT NULL,
`Attendance` int(11) DEFAULT '0',
`Absent Days` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `Subjects` (
`Subject` varchar(40) NOT NULL,
`Subject Code` varchar(6) NOT NULL,
`Dep` varchar(3) NOT NULL,
`Sem` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
现在我需要确保学生 (Student Attendance
.Attendance
) 上课的小时数不超过教员上课的小时数 (Faculty
.Hours Taken
) 对于该特定主题 (Subject Code
)。所以我写了一个触发器来检查是否满足上述条件来检查插入和更新。
如果小时数 (Student Attendance
.Attendance
) 大于我已将 Student Attendance
.Attendance
设置为某个字符串。我希望这可以作为断言并给我一个错误。
CREATE TRIGGER `HoursCheckonInsert` BEFORE INSERT ON `Student
Attendance`
FOR EACH ROW SET NEW.Attendance= IF(
( Select k.USN, s.`Subject Code`,f.`Hours Taken`,s.Attendance
From Faculty f, `Student Attendance` s, Student k
where s.`Subject Code` = f.`Subject Code` AND k.SEM = f.Sem AND k.Class=f.Section AND s.USN=k.USN AND
NEW.Attendance < f.`Hours Taken` OR NEW.Attendance = f.`Hours Taken`
),
NEW.Attendance,
'abcdef'
)
CREATE TRIGGER `HoursCheckonUpdate` BEFORE UPDATE ON `Student Attendance
FOR EACH ROW SET NEW.Attendance= IF(
(Select k.USN, s.`Subject Code`,f.`Hours Taken`,s.Attendance
From Faculty f, `Student Attendance` s, Student k
where NEW.`Subject Code`=f.`Subject Code` AND NEW.USN=k.USN AND
NEW.USN=s.USN AND k.SEM=f.Sem AND k.Class=f.Section AND k.DEP=f.DEP
AND (NEW.Attendance < f.`Hours Taken` OR NEW.Attendance = f.`Hours Taken`)
),
NEW.Attendance,
'abcdef'
)
当我尝试向学生出勤率中插入一个值时,出现此错误:
INSERT INTO `Student Attendance` (`USN`, `Subject Code`, `Attendance`, `Absent Days`) VALUES ('1KS15BT001', '15BT44', '0', '0');
Error:
#1241 - Operand should contain 1 column(s)
我是 MySQL 中的触发器新手。
MySQL 的 IF()
函数需要一个 标量表达式 作为它的第一个参数。标量表达式意味着它必须是一列,最多一行。
您使用的子查询有四列,行数未知。
从您的评论来看,您似乎只对是否有零行或多于零行符合条件感兴趣。你是对的,你 select 是什么列并不重要——如果你使用 EXISTS
谓词来测试子查询而不是在标量表达式中返回子查询的结果。
你应该使用 EXISTS
谓词来做你想做的事情。参见 https://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.html
CREATE TRIGGER `HoursCheckonInsert`
BEFORE INSERT ON `Student Attendance`
FOR EACH ROW
SET NEW.Attendance = IF(
EXISTS(
SELECT *
FROM Faculty AS f
JOIN `Student Attendance` AS s ON s.`Subject Code` = f.`Subject Code`
JOIN Student AS k ON k.SEM = f.Sem AND k.Class=f.Section AND k.uSN = s.USN
WHERE NEW.Attendance <= f.`Hours Taken`),
NEW.Attendance,
'abcdef');
那么您在 select 列表中放入什么列就没有关系了。我在上面显示了使用 SELECT *
。没关系,因为 EXISTS
只检查是否存在任何匹配的行,它根本不会有结果集——只有一个布尔值,表示是否有零行或多于零行。
您还应该使用 JOIN
语法代替过时的逗号式连接语法。我在上面的例子中展示了这一点。