Преобразование последовательностей из 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, необходимо:
- Создать таблицу, в которой будут храниться имя последовательности, текущее значение, инкремент, максимальное значение, минимальное значение и информация о том, будет ли последовательность циклической.
create table SWT_Sequence ( SeqName varchar(50), SeqValue DECIMAL(30,0), SeqInc bigint, SeqMax DECIMAL(30,0), SeqMin DECIMAL(30,0), SeqCyc int ); - Создать процедуру 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 - Создать функцию 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 - Создать функцию 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 - Вызвть процедуру 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