我使用MariaDB 11.0.2,我的数据库包含两个表。它有一个非常普通的主键和一个用于命名测试的列。
CREATE TABLE `Tests` (
`Test_ID` int(11) NOT NULL AUTO_INCREMENT,
`Test_Name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`Test_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=136 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
字符串
它包含34个字段。
然后我有另一个表,我在其中输入测试结果,并且有一个外键用于引用前一个列的自己的Test_ID列。
CREATE TABLE `Test_Results` (
`Test_ID` int(11) DEFAULT NULL,
`Numerator` tinyint(1) NOT NULL,
`Denominator` tinyint(1) DEFAULT NULL,
`Test_Num` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`Test_Num`),
KEY `Test_ID_Match` (`Test_ID`),
CONSTRAINT `Test_ID_Match` FOREIGN KEY (`Test_ID`) REFERENCES `Tests` (`Test_ID`) ON UPDATE CASCADE,
) ENGINE=InnoDB AUTO_INCREMENT=2456 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
型
分母由触发器自动输入
CREATE DEFINER=`root`@`localhost` TRIGGER Automatic_Denominators
BEFORE INSERT ON Test_Results
FOR EACH ROW
BEGIN
IF NEW.Test_ID in (3, 12, 14, 16, 19, 29) THEN
SET NEW.Denominator = 4;
ELSEIF NEW.Test_ID in (11, 21) THEN
SET NEW.Denominator = 5;
ELSEIF NEW.Test_ID in (25, 36) THEN
SET NEW.Denominator = 6;
ELSEIF NEW.Test_ID in (2, 9, 17) THEN
SET NEW.Denominator = 7;
ELSEIF NEW.Test_ID in (5, 27, 28) THEN
SET NEW.Denominator = 8;
ELSEIF NEW.Test_ID = 1 THEN
SET NEW.Denominator = 12;
ELSEIF NEW.Test_ID = (4, 8) THEN
SET NEW.Denominator = 15;
ELSEIF NEW.Test_ID in (6, 7, 22, 30) THEN
SET NEW.Denominator = 20;
ELSEIF NEW.Test_ID in (0) THEN
SET NEW.Denominator = 26;
END IF;
END
型
有趣的是:
MariaDB [Tutors_Prime]> insert into Test_Results (Test_ID, Numerator) VALUES (0, 26);
MariaDB [Tutors_Prime]> insert into Test_Results (Test_ID, Numerator) VALUES (4, 26);
型
测试ID为0和4的这两个条目返回ERROR 4078 (HY000): Illegal parameter data types int and row for operation '='
MariaDB [Tutors_Prime]> insert into Test_Results (Test_ID, Numerator) VALUES (5, 26);
型
但将正确输入任何其他测试ID。这很奇怪,因为0、4和5都出现在“Test”表中,但只有这两个数字返回错误。
我已经尝试用ON UPDATE CASCADE更改错误的主键值,所以我的数据仍然有意义。但是如果我将主键从0更改为100,错误仍然存在,现在:
MariaDB [Tutors_Prime]> insert into Test_Results (Test_ID, Numerator) VALUES (100, 26);
型
也会吐回错误。
知道为什么吗老实说,我甚至不明白错误代码。
谢谢你,谢谢
1条答案
按热度按时间vbkedwbf1#
变更
ELSEIF NEW.Test_ID = (4, 8) THEN
至ELSEIF NEW.Test_ID IN (4, 8) THEN