2017-01-31 72 views
0

我儘量讓一個觸發器來自動改變我的一些數據都被好MySQL的接受我的觸發器經過1個多行觸發器但在那之後,當我嘗試對數據更新顯示我的錯誤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在桌子上

+1

這裏沒有什麼可以解釋的;三個子查詢中的一個返回多條記錄。立即解決的辦法是在每個子查詢的末尾標記「LIMIT 1」,但更好的長期修復將是修復查詢的邏輯,使得您真正想要的記錄得到返回。 –

+0

我明白了,謝謝你現在修好了。在那裏我設置了mac,它正在返回更多的那一個。現在一切都看起來不錯,但沒有工作我的觸發器:/ – ZgrKARALAR

回答

0

所以,這是以下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列上創建臨時表,像

CREATE TABLE TEMP(error 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個嵌套的IFs,例如。

IF (durum=3 AND mac=1 AND ms=1) THEN ..

+0

感謝您的建議,幫助我找到問題@tim答案幫助我解決它,但之後,我明白我需要我的觸發器循環 – ZgrKARALAR