Как создать автоинкрементную строку?

Я столкнулся с проблемой увеличения строки на 01, 02,..., 10, 12.

  • У меня есть SQL-запрос, который дает мне AAAA06, который является максимальным в моей базе данных.
  • Теперь у меня есть требование, чтобы всякий раз, когда пользователь вызывал это, он проверял базу данных с максимальным номером. который в настоящее время является AAAA06 (максимально в настоящее время) и должен возвращать или печатать AAAA07.
  • Точно так же, когда максимальное значение равно AAAA09, оно должно увеличиваться до AAAA10 и т. д.
  • В качестве языка я использую Java, но я хочу знать, могу ли я добиться этого с помощью своего sql-запроса или мне нужно написать код Java для достижения этого?

Мой запрос, который я использую, похож на

select max(code) from mt_users where maincode='AAAA'

Вызов максимального нет выполняется мной; Я просто хочу увеличить или объединить все, что подходит, чтобы получить результат желания.

Он возвращает мне AAAA06, так как в настоящее время это максимальный.

Важные точки

  1. Когда изначально это AAAA, он должен показывать AAAA01
  2. Когда это AAAA09, он должен показывать AAAA10.
  3. когда это AAAA99, он покажет AAAA100

Примечание: в настоящее время у меня максимум как AAAA06, но для нового пользователя в будущем это может быть AAAE, поэтому я должен начать с AAAE01.

Каков тип данных этого поля в БД?

Hannes 07.02.2019 11:08

@Ханнес это варчар

manish thakur 07.02.2019 11:10

Кажется, у вас уже есть поле mainode (кстати, s означает «mainnode» или «maincode»?), которое содержит префикс «AAAA». Итак, вы не можете просто иметь числовое поле, которое автоматически увеличивается при доступе и возвращает конкатенацию обоих?

Thomas 07.02.2019 11:10

@ Томас, я не знаю, как этого добиться

manish thakur 07.02.2019 11:12

Такого рода проблемы являются симптомом плохого (т. е. наоборот) дизайна.

Strawberry 07.02.2019 11:14

@Strawberry, это дизайн БД, который кто-то сделал, теперь я должен добиться этого :(

manish thakur 07.02.2019 11:17

@SalmanA, это AAAA99, а не AAA99 ....... он покажет AAAA100

manish thakur 07.02.2019 11:42

@munish, тогда у вас возникнут проблемы с поиском максимального значения. SELECT MAX(s) FROM (SELECT 'AAAA100' s UNION SELECT 'AAAA21') x возвращает AAAA21!!!

Salman A 07.02.2019 12:22

@SalmanA нет при выборе max для AAAA100, он дает только AAAA100

manish thakur 07.02.2019 12:24
Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
3
9
132
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать lpad как

select case when code < 10 
            then concat( substring(maincode,1,4),lpad( max(code)+1 ,length(code+10),'0')) 
            else concat( substring(maincode,1,4),lpad( max(code)+1 ,length(code+1),'0')) 
            end
    as "Result String"
  from tab
 where maincode = 'AAAA01' -- 'AAAE';

В зависимости от чата между нами вам понадобится следующая логика:

select concat( substring(maincode,1,4), 
                     case when substring(maincode,5,length(maincode)-4) !=
                               substring(maincode,5,length(maincode)-4)+1
                     then
                         substring(maincode,5,length(maincode)-4)+1
                     else
                      lpad( 
                         substring(maincode,5,length(maincode)-4)+1,
                      length(maincode)-4,'0')
                     end
                )               
    as "Result String"
  from tab;

Demo

эй, сэр, это дает неправильный результат, так как для AAAA06 это дает AAAA0601

manish thakur 07.02.2019 11:37

@manishthakur ты уверен, дорогой друг, рассмотри демо, пожалуйста.

Barbaros Özhan 07.02.2019 12:03

позвольте мне проверить сэр

manish thakur 07.02.2019 12:05

эй, сэр, для AAAA он дает AAAA01, но для AAAA01 он дает ноль, так как в разделе where maincode=AAAA01 отображается ноль, вы можете проверить

manish thakur 07.02.2019 12:09

та же проблема, сэр, дает AAAA1 вместо AAAA01, а для AAAA01 дает ноль

manish thakur 07.02.2019 12:12

@manishthakur Хорошо, проблема решена. Можно попробовать с 0,1,..9,98,99,100......

Barbaros Özhan 07.02.2019 12:16

сэр, все та же проблема, когда основной код передается как AAAA01, он показывает ноль :(

manish thakur 07.02.2019 12:21

я думаю, что есть какое-то недоразумение

manish thakur 07.02.2019 12:22

@manishthakur из текста вопроса я понимаю, что есть два отдельных столбца, называемых основной код и код, и мой ответ зависит от этой логики.

Barbaros Özhan 07.02.2019 12:24
Ответ принят как подходящий

Краткий ответ - используйте этот запрос:

SELECT id AS PrevID, CONCAT(
    SUBSTRING(id, 1, 4),
    IF(CAST(SUBSTRING(id, 5) AS UNSIGNED) <= 9, '0', ''),
    CAST(SUBSTRING(id, 5) AS UNSIGNED) + 1
) AS NextID
FROM (
    -- since you allow strings such as AAAA20 and AAAA100 you can no longer use MAX
    SELECT id
    FROM t
    ORDER BY SUBSTRING(id, 1, 4) DESC, CAST(SUBSTRING(id, 5) AS UNSIGNED) DESC
    LIMIT 1
) x

Результаты:

| PrevID  | NextID  | 
| AAAA100 | AAAA101 | 
| AAAA21  | AAAA22  | 
| AAAA06  | AAAA07  | 

Ради интереса я написал эту хранимую процедуру, которая генерирует числа, которые выглядят как AAAA00 AAAA99 AAAB00 и т. д.:

CREATE FUNCTION NextID(PrevID VARCHAR(6))
RETURNS VARCHAR(6)
BEGIN
    DECLARE s VARCHAR(4);
    DECLARE i INT;
    DECLARE j INT;

    SET s = LEFT(PrevID, 4);
    SET s = REPLACE(s, 'A', '0');
    SET s = REPLACE(s, 'B', '1');
    SET s = REPLACE(s, 'C', '2');
    SET s = REPLACE(s, 'D', '3');
    SET s = REPLACE(s, 'E', '4');
    SET s = REPLACE(s, 'F', '5');
    SET s = REPLACE(s, 'G', '6');
    SET s = REPLACE(s, 'H', '7');
    SET s = REPLACE(s, 'I', '8');
    SET s = REPLACE(s, 'J', '9');
    SET s = REPLACE(s, 'K', 'A');
    SET s = REPLACE(s, 'L', 'B');
    SET s = REPLACE(s, 'M', 'C');
    SET s = REPLACE(s, 'N', 'D');
    SET s = REPLACE(s, 'O', 'E');
    SET s = REPLACE(s, 'P', 'F');
    SET s = REPLACE(s, 'Q', 'G');
    SET s = REPLACE(s, 'R', 'H');
    SET s = REPLACE(s, 'S', 'I');
    SET s = REPLACE(s, 'T', 'J');
    SET s = REPLACE(s, 'U', 'K');
    SET s = REPLACE(s, 'V', 'L');
    SET s = REPLACE(s, 'W', 'M');
    SET s = REPLACE(s, 'X', 'N');
    SET s = REPLACE(s, 'Y', 'O');
    SET s = REPLACE(s, 'Z', 'P');

    SET i = RIGHT(PrevID, 2);
    SET j = CONV(s, 26, 10);

    SET i = i + 1;
    IF i > 99 THEN
        SET i = 0;
        SET j = j + 1;
    END IF;

    SET s = CONV(j, 10, 26);
    SET s = REPLACE(s, 'P', 'Z');
    SET s = REPLACE(s, 'O', 'Y');
    SET s = REPLACE(s, 'N', 'X');
    SET s = REPLACE(s, 'M', 'W');
    SET s = REPLACE(s, 'L', 'V');
    SET s = REPLACE(s, 'K', 'U');
    SET s = REPLACE(s, 'J', 'T');
    SET s = REPLACE(s, 'I', 'S');
    SET s = REPLACE(s, 'H', 'R');
    SET s = REPLACE(s, 'G', 'Q');
    SET s = REPLACE(s, 'F', 'P');
    SET s = REPLACE(s, 'E', 'O');
    SET s = REPLACE(s, 'D', 'N');
    SET s = REPLACE(s, 'C', 'M');
    SET s = REPLACE(s, 'B', 'L');
    SET s = REPLACE(s, 'A', 'K');
    SET s = REPLACE(s, '9', 'J');
    SET s = REPLACE(s, '8', 'I');
    SET s = REPLACE(s, '7', 'H');
    SET s = REPLACE(s, '6', 'G');
    SET s = REPLACE(s, '5', 'F');
    SET s = REPLACE(s, '4', 'E');
    SET s = REPLACE(s, '3', 'D');
    SET s = REPLACE(s, '2', 'C');
    SET s = REPLACE(s, '1', 'B');
    SET s = REPLACE(s, '0', 'A');

    RETURN CONCAT(LPAD(s, 4, 'A'), LPAD(i, 2, '0'));
END

SELECT NextID('AAAA01') -- AAAA02
SELECT NextID('AAAA99') -- AAAB00
SELECT NextID('AAAB99') -- AAAC00
SELECT NextID('AAAZ99') -- AABA00

id/PrevID — это столбец, содержащий строку. NextID — это «сгенерированный» идентификатор на основе предыдущего идентификатора (добавлен для демонстрации).

Salman A 07.02.2019 13:27

эй, когда будет BBBB, он собирается дать BBBB01?

manish thakur 07.02.2019 13:40

эй, сэр, у меня очень маленькая проблема... когда вы будете свободны, прокомментируйте здесь

manish thakur 14.02.2019 08:00

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