Как обновить таблицу после вставки в другую таблицу с помощью MySQL? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь создать триггер для обновления таблицы (клиента) после вставки в другую таблицу (счет-фактуру), вот где я застрял:

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 ;

Я ожидаю всего 01:30:00, когда bank_time = 00:00:00 и paid_time = 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 голосов
/ 22 января 2019

Первое, на что нужно обратить внимание, это то, что, если bank_time равно NULL, добавление чего-либо к нему все равно даст NULL. COALESCE может использоваться для обработки этого варианта использования.

Также рекомендуется использовать функцию MySQL ADDTIME () для добавления времени вместо обычной операции сложения.

Я бы предложил заменить это:

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

См. Эту скрипку БД для демонстрации; Вы можете комментировать / раскомментировать свою предыдущую версию и сравнивать ее результаты с новой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...