У меня возникла дилемма, когда мне нужно, чтобы база данных MySQL создавала номер клиента на основе первых трех символов введенного имени нового клиента и добавляла увеличивающееся значение. Например:
Таблица клиентов:
+----+----------------------------------------------+--------------+
| id | clientName | clientNumber |
+----+----------------------------------------------+--------------+
| 1 | Accelerated Learning | ACC00 |
| 2 | Acceleration Systems | ACC01 |
| 3 | Acme,Inc. | ACM00 |
Обычно я делал бы это в форме отправки в интерфейсе пользователя, но по необъяснимым причинам спецификация требует, чтобы это обрабатывалось БД. Я пытаюсь написать что-то вроде этого, но не могу понять:
Курок:
CREATE DEFINER = CURRENT_USER TRIGGER `crmdev`.`clients_BEFORE_INSERT` BEFORE INSERT ON `clients` FOR EACH ROW
BEGIN
DECLARE prefix varchar(3);
DECLARE suffix INT(3);
SET prefix = SUBSTRING(NEW.clientName,1,3);
SET suffix = (
SELECT COUNT(*),SUBSTRING(clientName,1,3) = prefix + 1;
SET NEW.clientNumber = CONCAT(prefix,suffix);
END
Заранее благодарим за помощь / руководство!






У вас есть синтаксические ошибки в назначении suffix. Вам не хватает пунктов FROM и WHERE, и вам нужно добавить 1 в счетчик, а не в prefix.
SET suffix = (
SELECT COUNT(*)+1
FROM clients
WHERE SUBSTRING(clientName,1,3) = prefix);
Очень признателен, Бармар. Это поставило меня на верный путь. Добавлены UPPER и LPAD к окончательному назначению SET, чтобы префикс был написан с заглавной буквы, а в нумерации использовались полные 3 целых числа.
Вот готовый продукт, если он полезен другим и спасибо Бармару:
Курок:
DECLARE prefix varchar(3);
DECLARE suffix INT(3);
SET prefix = SUBSTRING(NEW.clientName,1,3);
SET suffix = (
SELECT COUNT(*)+1
FROM clients
WHERE SUBSTRING(clientName,1,3) = prefix);
SET NEW.clientNumber = UPPER(CONCAT(prefix,LPAD(suffix,3,0)));
Вам нужен пункт
FROMвSELECT.