簡體   English   中英

如何在MySQL中更新第三張表時將多個記錄從一個表插入到另一個表

[英]How to insert multiple records from one table into another on update of third table in MySQL

我在開發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 如果該差是<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;

為此,您需要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 ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM