Я импортирую прошлые счета из файлов CSV в таблицу MariaDB (MySQL).
Счет id построен на других полях:
client-order[variant][-subinvoice]
например. 0123-5c-0
До сих пор значения для id вычислялись пакетно с помощью этого SQL-запроса:
UPDATE invoices SET
id = CONCAT (client,'-',
order,
IFNULL(variant,''),
IF(subinvoice IS NULL, '',CONCAT('-',subinvoice))
);
Поскольку столбец id теперь является PRIMARY KEY, я нужно преобразовать приведенный выше запрос в триггер генерирует id «на лету» при вставке данных из записей CSV.
Вот одно из возможных решений. (Пользователь P. Salmon, который помог мне отладить мой код; спасибо ему!)
DELIMITER //
DROP TRIGGER IF EXISTS invoice_generate_id//
CREATE TRIGGER invoice_generate_id
BEFORE INSERT ON invoices
FOR EACH ROW
BEGIN
SET NEW.id = CONCAT (new.client,'-',
new.order,
IFNULL(new.variant,''),
IF(new.subinvoice IS NULL, '',CONCAT('-',new.subinvoice))
);
END//
DELIMITER ;
Спасибо. Вы были абсолютно правы. Я обновил код допустимым на основе ваших предложений и синтаксиса, который использовал мой пакетный SQL-запрос. Н.Б. При создании триггера phpMyAdmin упоминает ошибку в точке с запятой, которая заканчивается выражением SET(). Просто нужно игнорировать его, так как триггер действителен.






Вот триггер, который синтаксически в порядке. Обратите внимание на использование слияния
DELIMITER //
DROP TRIGGER IF EXISTS invoice_generate_id//
CREATE TRIGGER invoice_generate_id
BEFORE INSERT ON invoices
FOR EACH ROW
BEGIN
set NEW.id = CONCAT (new.client,'-',
new.order,
coalesce(concat('-',new.variant,''),''),
coalesce(concat('-',new.subinvoice,''),'')
)
;
END//
DELIMITER ;
Спасибо за ваш триггер, который синтаксически в порядке. Это было большим подспорьем. Использование «слияния» элегантно. Для variant мы должны избегать окружающего concat, если ссылаемся на мой исходный пример (поскольку вариант не предварялся дефисом). Для subinvoice я оставил функции IF() и CONCAT(), потому что они облегчают понимание кода, если я перечитаю код через несколько месяцев, хотя должен признать, что COALESCE() более элегантен.
В этом есть ряд неправильных вещей, которые вы не можете иметь, и if..else..end, если как часть оператора concat - вам нужен оператор SET для установки NEW.value, и я подозреваю, что клиент, вариант и дополнительный счет-фактура должны быть предшествует NEW. Также вы можете сделать это как часть оператора load data infile - см. руководство, где это относится к переменным. –