如何在MySQL中更新第三个表时将多个记录从一个表插入到另一个表中

时间:2017-07-14 12:18:43

标签: mysql triggers

我在MySQL中开发逻辑时遇到了困难。我不知道如何在更新后的表中插入多个记录。

CREATE TABLE primeira(
ID int PRIMARY KEY AUTO_INCREMENT, 
nome varchar(30) NOT NULL,
valor int DEFAULT 0
);

CREATE TABLE segunda(
ID int PRIMARY KEY AUTO_INCREMENT,
ID_primeira int,
ultimo_valor int DEFAULT 0,
credito int NOT NULL,
limite int DEFAULT 0,
FOREIGN KEY(ID_primeira) references primeira(ID)
);

CREATE TABLE terceira(
ID int PRIMARY KEY AUTO_INCREMENT,
ID_segunda int,
`data` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
estado boolean DEFAULT false,
FOREIGN KEY(ID_segunda) references segunda(ID)
);

CREATE TRIGGER tr_segundaLimite_INS
BEFORE INSERT ON segunda FOR EACH ROW
SET NEW.limite = New.ultimo_valor + New.credito;

DELIMITER //
CREATE TRIGGER tr_primeira_UPD 
AFTER UPDATE ON primeira FOR EACH ROW      
   IF (SELECT limite FROM segunda WHERE segunda.ID_primeira = New.ID AND 
       (limite - NEW.valor)< 50) THEN
        INSERT INTO terceira(ID_segunda)            
        VALUES ((SELECT ID FROM segunda WHERE segunda.ID_primeira = New.ID 
        AND (limite - NEW.valor)< 50));
   END IF;
END
//
DELIMITER ;

我将使用带有函数的过程来选择数据。这个TRIGGER的问题在于,当有多个匹配记录时,它无法正常工作。

我得到的错误是 -

subquery returns more than 1 row.

目标是:更新primeira.valor后,触发器会减去segunda.limite - New.valor。如果这个差异是&lt; 50然后所有匹配的segunda.ID将在terceira.ID_segundaterceira上注册。

我使用以下数据:

INSERT INTO primeira(nome,valor)
VALUES 
('Burro',800),
('Chiconizio',300),
('Xerosque',400),
('Shrek',600);

INSERT INTO segunda(ID_primeira,ultimo_valor,credito)
VALUES 
(1,600,800),
(1,700,400),
(1,800,500),
(2,150,200),
(2,200,180),
(2,250,300);

UPDATE primeira 
SET Valor = 330
WHERE ID = 2;

1 个答案:

答案 0 :(得分:0)

您需要CURSOR。您可以尝试以下触发器代码。我希望这能解决你的问题。

DELIMITER //
CREATE TRIGGER tr_primeira_UPD 
AFTER UPDATE ON primeira FOR EACH ROW
  BEGIN
   DECLARE v_limite_diff INT;
   DECLARE v_seg_id INT;
   DECLARE done INT DEFAULT FALSE;
   DECLARE c1 CURSOR FOR SELECT (s.limite - NEW.valor), s.id
     FROM segunda s WHERE s.ID_primeira = New.ID;
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

   OPEN c1; 
   my_loop: LOOP
     FETCH c1 INTO v_limite_diff, v_seg_id;
     IF done THEN
       LEAVE my_loop;
     END IF;
     IF( v_limite_diff < 50 ) THEN
       INSERT INTO terceira(ID_segunda) VALUES(v_seg_id);
     END IF;
   END LOOP;
END//
DELIMITER ;