我尝试制作一个触发器来自动更改我的一些数据,一切都很好,mysql 接受我的触发器,但之后当我尝试更新显示错误的数据时
子查询返回多于 1 行
首先,我的数据库对此有点大,我在这里复制我选择的限制为 3
我的触发点是
DELIMITER $$
CREATE TRIGGER test3 AFTER UPDATE ON `coupons_data_result`
BEGIN
DECLARE mac INT default 0;
DECLARE durum INT default 0;
DECLARE ms1 INT default 0;
SET mac =(SELECT match_guess_type_id FROM coupon_rows WHERE match_code=NEW.cpnd_benzersiz);
SET durum =(select cpnd_status FROM matchs_result where cpnd_benzersiz=NEW.cpnd_benzersiz);
SET ms1 =(select cpnd_macsonucu1 FROM coupons_data_result where cpnd_benzersiz=NEW.cpnd_benzersiz);
IF (durum=3) THEN
IF(mac=1)THEN
IF(ms=1)THEN
UPDATE coupon_rows SET match_result='1' WHERE match_code=NEW.cpnd_benzersiz;
Else
UPDATE coupon_rows SET match_result='0' WHERE match_code=NEW.cpnd_benzersiz;
END IF;
END IF;
END IF;
END$$
DELIMITER ;
我在数据库中选择的限制为 3
+---------------------+-------------+
| match_guess_type_id | match_code |
+---------------------+-------------+
| 3 | 20170130398 |
| 0 | 20170130399 |
| 2 | 20170130401 |
+---------------------+-------------+
3 rows in set (0.00 sec)
+-------------+----------------+
| cpnd_status | cpnd_benzersiz |
+-------------+----------------+
| 3 | 20170129312 |
| 3 | 20170129313 |
| 3 | 20170129314 |
+-------------+----------------+
3 rows in set (0.00 sec)
+-----------------+----------------+
| cpnd_macsonucu1 | cpnd_benzersiz |
+-----------------+----------------+
| 0 | 20170129312 |
| 1 | 20170129313 |
| 1 | 20170129314 |
+-----------------+----------------+
3 rows in set (0.00 sec)
结束我尝试更新的列表
+--------------+-------------+
| match_result | match_code |
+--------------+-------------+
| 1 | 20170130398 |
| 3 | 20170130399 |
| 3 | 20170130401 |
+--------------+-------------+
3 rows in set (0.00 sec)
Ps:所有match_code和benzersiz都在 table 上
最佳答案
因此,以下 3 个语句之一失败了:
SET mac =(SELECT match_guess_type_id FROM coupon_rows WHERE match_code=NEW.cpnd_benzersiz);
SET durum =(select cpnd_status FROM matchs_result where cpnd_benzersiz=NEW.cpnd_benzersiz);
SET ms1 =(select cpnd_macsonucu1 FROM coupons_data_result where cpnd_benzersiz=NEW.cpnd_benzersiz);
其中一个 SELECT 语句返回多行,因此 MySQL 无法分配该值。在示例中看不到重复项的原因是行数限制为 3。
出于调试目的,我建议创建一个包含 1 列的临时表,例如
创建表温度(错误varchar(100));
如果其中一个查询返回多条记录,则从触发器内部添加一条错误消息,例如:
DECLARE count INT default 0;
SET count = (SELECT count(*) FROM coupon_rows WHERE match_code=NEW.cpnd_benzersiz);
IF (count > 1) THEN //INSERT into temp with with error message
这将为您提供有关失败原因的更多信息。修复后,您可以删除 temp
表并进行计数。
此外,在触发器中,您可以使用一个 IF
以及通过 AND
连接的条件,而不是 3 个嵌套的 IF
,例如
IF (durum=3 AND mac=1 AND ms=1) THEN ..
关于MYSQL子查询更新后返回多于1行触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41947740/