Преобразование последовательностей из Microsoft SQL Server в MySQL

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

Рассмотрим следующий фрагмент кода:

 CREATE SEQUENCE CountBy1  
   START WITH 1  
   INCREMENT BY 1 ;  
 GO
 CREATE TABLE dbo.[MyTable1]
 (
    [ID] [bigint] PRIMARY KEY NOT NULL DEFAULT (NEXT VALUE FOR dbo.CountBy1),
    [Title1] [nvarchar](64) NOT NULL
 );
 GO

Чтобы смоделировать последовательность в MySQL, необходимо:

  1. Создать таблицу, в которой будут храниться имя последовательности, текущее значение, инкремент, максимальное значение, минимальное значение и информация о том, будет ли последовательность циклической.
    create table SWT_Sequence
    (
    SeqName varchar(50), 
    SeqValue DECIMAL(30,0), 
    SeqInc bigint, 
    SeqMax DECIMAL(30,0), 
    SeqMin DECIMAL(30,0), 
    SeqCyc int
    );
  2. Создать процедуру SWP_CrtSeq, которая добавляет запись в таблицу SWT_Sequence.
    create procedure SWP_CrtSeq(SeqName varchar(50), SeqValue DECIMAL(30,0), SeqInc bigint, SeqMax DECIMAL(30,0), SeqMin DECIMAL(30,0), SeqCyc int)
    begin
    insert into SWT_Sequence values(SeqName, SeqValue, SeqInc, SeqMax, SeqMin, SeqCyc);
    end
  3. Создать функцию SWF_CurrVal для получения текущего значения. Функция SWF_CurrVal принимает один параметр — имя последовательности, по которой будет получено текущее значение в таблице SWT_Sequence.
    create function SWF_CurrVal(SeqN varchar(50))
    returns DECIMAL(30,0)
    deterministic
    begin
    declare SeqVal DECIMAL(30,0);
    select SeqValue into SeqVal from SWT_Sequence where SeqName=SeqN for update;
    return SeqVal;
    end
  4. Создать функцию SWF_NextVal для получения следующего значения в последовательности. В качестве параметра функция принимает имя последовательности. Используя этот параметр, мы получаем значение из таблицы SWT_Sequence. Затем мы устанавливаем новое значение для значения последовательности. Если значение последовательности равно максимальному значению и последовательность циклическая, то устанавливаем минимальное значение. В противном случае мы добавляем значение инкремента к значению последовательности.
    create function SWF_NextVal(SeqN varchar(50))
    returns DECIMAL(30,0)
    deterministic
    begin
    declare SeqVal DECIMAL(30,0);
    select SeqValue into SeqVal from SWT_Sequence where SeqName=SeqN for update;
    update SWT_Sequence set SeqValue = case when SeqValue = SeqMax and SeqCyc = 1 then SeqMin else SeqValue + SeqInc end where SeqName=SeqN;
    return SeqVal;
    end
  5. Вызвть процедуру SWP_CrtSeq, чтобы создать новую последовательность с именем CountBy1. В таблице для получения следующего значения для столбца ID будет использоваться функция SWF_NextVal.
    call SWP_CrtSeq('CountBy1',1,1,1,1,0); 
    CREATE TABLE MyTable1
    (
    ID BIGINT PRIMARY KEY NOT NULL   DEFAULT SWF_NextVal('CountBy1'),
    Title1 NVARCHAR(64) NOT NULL
    );

    Давайте сравним результаты:

    Microsoft SQL Server MySQL
    SELECT current_value FROM sys.sequences WHERE name = 'CountBy1' ; select SWF_CurrVal('CountBy1')
    SELECT NEXT VALUE FOR CountBy1 select SWF_NextVal('CountBy1')

    Если для организации счетчика используется IDENTITY, а не последовательность, то его эквивалентом в MySQL будет AUTO_INCREMENT.

    Microsoft SQL Server MySQL
    CREATE TABLE dbo.MyTable1 ( ID BIGINT IDENTITY (1, 1) NOT NULL, Title1 NVARCHAR(64) NOT NULL, PRIMARY KEY (ID) ); CREATE TABLE MyTable1 ( ID BIGINT NOT NULL AUTO_INCREMENT, Title1 NVARCHAR(64) NOT NULL, PRIMARY KEY(ID) ) AUTO_INCREMENT = 1;

Но если вам нужна последовательность, то конвертация будет происходить так, как описано в статье.


Если у вас есть другие вопросы, пожалуйста, свяжитесь с нами: support@convertum.ru