Substring, Count и Concat в триггере перед вставкой? - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть дилемма, когда мне нужно, чтобы база данных MySQL создала номер клиента на основе первых 3 символов введенного нового имени клиента и добавила возрастающее значение. Например:

Таблица клиентов:

+----+----------------------------------------------+--------------+
| id | clientName                                   | clientNumber |
+----+----------------------------------------------+--------------+
|  1 | Accelerated Learning                         | ACC00        |
|  2 | Acceleration Systems                         | ACC01        |
|  3 | Acme,Inc.                                    | ACM00        |

Обычно я делал бы это в форме представления на внешнем интерфейсе, но по необъяснимым причинам спецификация хочет, чтобы это обрабатывалось БД. Я пытаюсь написать что-то вроде этого, но не могу понять это правильно:

Trigger:

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

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

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

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

Trigger:

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)));
0 голосов
/ 01 ноября 2018

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

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