SET SQL_SAFE_UPDATES = 0;
use my_database;
DELIMITER $$
DROP PROCEDURE IF EXISTS Comit $$
CREATE PROCEDURE Comit ()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE ids INT;
DECLARE leftChilds INT;
DECLARE cur CURSOR FOR SELECT id FROM user;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
ins_loop: LOOP
FETCH cur INTO ids;
IF done THEN
LEAVE ins_loop;
END IF;
SET leftChilds = ( SELECT turnoverBalance FROM user WHERE proposer = ids AND side = 'left' LIMIT 1 );
INSERT INTO log(`log`) VALUES ( leftChilds );
END LOOP;
CLOSE cur;
END $$
当我调用程序时调用Comit();这回复了我的错误:
1048 - 列'log'不能为空
答案 0 :(得分:0)
您的子查询正在生成NULL
值,可能是因为proposer
条件不匹配。当然,您的数据在NULL
中的turnoverBalance
或没有user
一侧的行也可能有'left'
个值。
在任何情况下,为什么使用游标来轻松完成单个查询?像这样的东西可以取代所有的逻辑:
INSERT INTO log(log)
SELECT turoverBalance
FROM user
WHERE proposer IN (SELECT id FROM user) AND side = 'left')
GROUP BY proposer;
答案 1 :(得分:0)
首先,它是存储过程,而不是触发器。
检查你的setChilds查询返回的内容,它应该返回一些值,单独运行它。
您可以签入存储过程
If(leftChilds not NULL)
insert into log('log') values (leftChilds)