Подстрока, счетчик и конкат в триггере до вставки?

У меня возникла дилемма, когда мне нужно, чтобы база данных 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

Заранее благодарим за помощь / руководство!

Вам нужен пункт FROM в SELECT.

Barmar 01.11.2018 01:27
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
1
491
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У вас есть синтаксические ошибки в назначении suffix. Вам не хватает пунктов FROM и WHERE, и вам нужно добавить 1 в счетчик, а не в prefix.

SET suffix = (
    SELECT COUNT(*)+1
    FROM clients
    WHERE SUBSTRING(clientName,1,3) = prefix);

Очень признателен, Бармар. Это поставило меня на верный путь. Добавлены UPPER и LPAD к окончательному назначению SET, чтобы префикс был написан с заглавной буквы, а в нумерации использовались полные 3 целых числа.

AMPSYS 01.11.2018 02:46

Вот готовый продукт, если он полезен другим и спасибо Бармару:

Курок:

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)));

Другие вопросы по теме