Как изменить этот код с правильным синтаксисом в mariaDB?

Я новичок в этих функциях sql. Мне нужно настраиваемое поле с автоматическим увеличением со следующей функцией SQL.

CREATE FUNCTION nextvacancy() returns char(5) as begin
declare @lastval char(5)
declare @i int
declare @newId char(5)

set @lastval = (select max(vacancyId) from vacancy)

if @lastval IS NULL 
    set @lastval = 'V0000'

    set @i = right(@lastval,4) + 1

    set @newId = 'V' + right('000' + convert(varchar(10),@i),4)

return @newId end

Это нормально работало с mssql, но на сервере mariaDb показывает эту ошибку.

# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис рядом с 'declare @lastval char (5) объявить @i int объявить @newId char (5)

Результат должен быть таким. V0001, V0002

Как я могу адаптировать этот код к серверу mDb?

Этот код SQL будет нет работать в MySQL .. Предложение CREATE FUNCTION содержит ли нет ключевое слово AS в MySQL ... Это похоже на SQL Server (MSSQL) синтаксис, у которого есть ключевое слово AS ... Итак, я изменил теги, потому что он выглядит так вы конвертируете синтаксис SQL-сервера (MSSQL) в синтаксис MariaDB (MySQL)

Raymond Nijland 17.12.2018 14:18

да. Это mssql

LizardKingLK 17.12.2018 15:58

Это нет хороший запрос SQL Server. MAX+1 просто напрашивается на ошибки целостности из-за повторяющихся значений. SQL Server имеет объекты SEQUENCE для этого задания, как и MariaDB. В обеих базах данных вы можете записать SELECT NEXT VALUE FOR VacanciesSequence AS VacancyID, чтобы получить следующее значение. Форматирование различается для каждой базы данных. В SQL Server вы должны написать select format(someID,'\V0000') для форматирования значения с префиксом V и 4 цифрами. select format(next value for vacancies,'\V0000') as NextVacancy

Panagiotis Kanavos 17.12.2018 16:12

В MariaDB вам, вероятно, придется явно добавить префикс V и использовать LPAD для ведущих нулей: select 'V' + LPAD(next value for vacancies,4) as NextVacancy.

Panagiotis Kanavos 17.12.2018 16:19

На самом деле я думаю, что ваша настоящая проблема состоит в том, чтобы запутать рендеринг с постоянными значениями. Вы должны использовать обычное автоматическое приращение, но оказывать его с ведущей буквой «V», желательно на уровне приложения (т.е. не в каком-либо SQL), поскольку ведущая буква «V» не имеет ничего общего с данными или где / как они сохраняются.

Bohemian 17.12.2018 16:47
DELIMITER; полуколоны; THEN; и т. д. и т. д. Изучите синтаксис в руководстве. Изучите примеры на этом форуме.
Rick James 18.12.2018 17:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Этот код также был очень плохой для Sql Server, потому что он не смог инкапсулировать приращение / выбор в транзакции. Чтобы исправить это для Sql Server, его следует изменить на использование столбца идентификаторов или (что еще лучше) последовательность и СЛЕДУЮЩЕЕ ЗНАЧЕНИЕ ДЛЯ.

И что самое интересное, последовательность работает и в MySql / MariaDB. Итак, чтобы перевести этот код, сначала создайте последовательность:

CREATE SEQUENCE VacancySeq START WITH CurrentMaxValueHere INCREMENT BY 1;

Затем обновите функцию, чтобы извлечь из последовательности:

return next value for VacancySeq

Я знаю, что здесь будет отсутствовать V и ведущие нули ... но было бы ошибкой хранить их как часть значения столбца. Это проблема форматирование, и форматирование должно выполняться в максимально возможной степени на клиенте, а не в БД.

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