我正在尝试创建一个触发器,以在插入另一个表(发票)后更新表(客户),这是我遇到的问题:
delimiter |
CREATE TRIGGER after_insert_invoice AFTER INSERT ON invoice FOR EACH ROW
BEGIN
SET @TIME=new.paid_time
SET @id=new.id_customer
UPDATE customer SET bank_time = bank_time + @TIME WHERE id = @id
END |
delimiter ;
当bank_time = 00:00:00和paid_time = 01:30:00时,我预计总共为01:30:00。但这将bank_time设置为NULL,我不知道为什么。
这是表格结构:
CREATE TABLE `customer` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`bank_time` TIME NULL DEFAULT '00:00:00',
`country` VARCHAR(25) NULL DEFAULT NULL,
`NAME` VARCHAR(25) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
;
CREATE TABLE `invoice` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`paid_time` TIME NULL DEFAULT NULL,
`id_customer` INT(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `id_customer` (`id_customer`),
CONSTRAINT `invoice_ibfk_1` FOREIGN KEY (`id_customer`) REFERENCES `customer` (`id`)
)
ENGINE=InnoDB
;
由于某些原因,我无法发表评论,但这是我在@GMB回答后尝试的方法,但仍然没有运气:
delimiter |
CREATE TRIGGER after_insert_invoice AFTER INSERT ON invoice FOR EACH ROW
BEGIN
SET @TIME = new.paid_time,
SET @identif = new.id_customer,
UPDATE customer SET bank_time = ADDTIME(COALESCE(bank_time, 0), @TIME) WHERE id = @identif;
END |
delimiter ;
答案 0 :(得分:0)
首先要注意的是,如果bank_time
为NULL
,则向其中添加任何内容仍将产生NULL
。 COALESCE
可用于处理该用例。
此外,使用MySQL ADDTIME() function来添加时间也是一种好习惯,而不是使用常规的加法操作。
我建议将其替换:
UPDATE customer SET bank_time = bank_time + @time WHERE id = @id
使用:
UPDATE customer SET bank_time = ADDTIME(COALESCE(bank_time, 0), @time) WHERE id = @id
See this db fiddle 进行演示;您可以注释/取消注释以前的版本,并将其结果与新版本进行比较。