用mysql插入另一个表后如何更新表?

时间:2019-01-22 16:22:20

标签: mysql triggers

我正在尝试创建一个触发器,以在插入另一个表(发票)后更新表(客户),这是我遇到的问题:

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 ;

1 个答案:

答案 0 :(得分:0)

首先要注意的是,如果bank_timeNULL,则向其中添加任何内容仍将产生NULLCOALESCE可用于处理该用例。

此外,使用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 进行演示;您可以注释/取消注释以前的​​版本,并将其结果与新版本进行比较。