SETVAL
SEQUENCE были введены в MariaDB 10.3.
Синтаксис
SETVAL(sequence_name, next_value, [is_used, [round]])
Описание
Устанавливает следующее возвращаемое значение для SEQUENCE.
Эта функция совместима с синтаксисом PostgreSQL, расширенным аргументом round.
Если аргумент is_used не задан или равен 1 или true, то следующее используемое значение будет на единицу больше заданного значения. Если is_used равен 0 или false, то следующее сгенерированное значение будет равно заданному значению.
Если используется round, то он установит значение round (или внутренний счетчик циклов, начинающийся с нуля) для последовательности. Если round не используется, предполагается, что он равен 0.
next_value должен быть целочисленной константой.
Для таблиц SEQUENCE, определенных с помощью CYCLE (см. CREATE SEQUENCE), следует использовать как next_value, так и round, чтобы определить следующее значение. В этом случае текущее значение последовательности определяется как round, next_value.
Результат, возвращаемый SETVAL() — next_value или NULL, если заданное next_value и round меньше текущего значения.
SETVAL() не установит значение SEQUENCE на значение, меньшее текущего значения. Это необходимо для обеспечения репликации SETVAL(). Если вы хотите установить значение SEQUENCE на меньшее число, используйте ALTER SEQUENCE.
Если используется CYCLE, сначала сравниваются round и next_value, чтобы определить, является ли значение больше текущего значения.
Внутренне в сервере MariaDB используется SETVAL(), чтобы уведомить подчиненные узлы о том, что значение SEQUENCE изменилось. Подчиненный узел может получить SETVAL() в неправильном порядке, но это нормально, поскольку только наибольшее значение окажет влияние.
Для SETVAL требуется право INSERT.
Примеры
SELECT setval(foo, 42); -- Next nextval will return 43 SELECT setval(foo, 42, true); -- Same as above SELECT setval(foo, 42, false); -- Next nextval will return 42
Установка более высоких и более низких значений в последовательности с шагом 10:
SELECT NEXTVAL(s); +------------+ | NEXTVAL(s) | +------------+ | 50 | +------------+ SELECT SETVAL(s, 100); +----------------+ | SETVAL(s, 100) | +----------------+ | 100 | +----------------+ SELECT NEXTVAL(s); +------------+ | NEXTVAL(s) | +------------+ | 110 | +------------+ SELECT SETVAL(s, 50); +---------------+ | SETVAL(s, 50) | +---------------+ | NULL | +---------------+ SELECT NEXTVAL(s); +------------+ | NEXTVAL(s) | +------------+ | 120 | +------------+
Пример, демонстрирующий round:
CREATE OR REPLACE SEQUENCE s1 START WITH 1 MINVALUE 1 MAXVALUE 99 INCREMENT BY 1 CACHE 20 CYCLE; SELECT SETVAL(s1, 99, 1, 0); +----------------------+ | SETVAL(s1, 99, 1, 0) | +----------------------+ | 99 | +----------------------+ SELECT NEXTVAL(s1); +-------------+ | NEXTVAL(s1) | +-------------+ | 1 | +-------------+
Следующее утверждение вернет NULL, поскольку заданное next_value и round меньше текущего значения.
SELECT SETVAL(s1, 99, 1, 0); +----------------------+ | SETVAL(s1, 99, 1, 0) | +----------------------+ | NULL | +----------------------+ SELECT NEXTVAL(s1); +-------------+ | NEXTVAL(s1) | +-------------+ | 2 | +-------------+
Увеличение значения округления с нуля до 1 позволит вернуть next_value.
SELECT SETVAL(s1, 99, 1, 1); +----------------------+ | SETVAL(s1, 99, 1, 1) | +----------------------+ | 99 | +----------------------+ SELECT NEXTVAL(s1); +-------------+ | NEXTVAL(s1) | +-------------+ | 1 | +-------------+
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/setval/