MYSQL子查询更新后返回多于1行触发器

标签 mysql if-statement triggers

我尝试制作一个触发器来自动更改我的一些数据,一切都很好,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/

相关文章:

linux - 如何在 makefile 中使用导出的变量?

c++ - 在 if 语句中处理 boolean 函数

MySQL 5.7 创建触发器语法错误?

MYSQL触发器插入或更新不同的表

php - 如何使用 php mysqli 更新多于 99 的行

PHP递归函数不循环更深

MySQL - 参数化查询

mysql - 我想在 mysql 的 if 语句中使用用户 'substr'

javascript - jQuery:在 onclick 之前触发焦点以获取 Ajax 建议

java - JDBC executeQuery 无故显示错误