适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
修改现有序列对象的参数。 如果序列是使用 CACHE 此选项创建的,则更改序列将重新创建缓存。
序列对象是通过使用 CREATE SEQUENCE 语句创建的。 序列是整数值,可以是返回整数的任何数据类型。 无法使用语句更改 ALTER SEQUENCE 数据类型。 若要更改数据类型,请删除或创建序列对象。
序列对象是用户定义的绑定到架构的对象,用于可根据规范生成数值序列。 通过调用 NEXT VALUE FOR 函数从序列生成新值。 用于 sp_sequence_get_range 一次性获取多个序列号。 有关同时使用这sp_sequence_get_range两个CREATE SEQUENCE函数的信息和NEXT VALUE FOR方案,请参阅序列号。
语法
ALTER SEQUENCE [ schema_name. ] sequence_name
[ RESTART [ WITH <constant> ] ]
[ INCREMENT BY <constant> ]
[ { MINVALUE <constant> } | { NO MINVALUE } ]
[ { MAXVALUE <constant> } | { NO MAXVALUE } ]
[ CYCLE | { NO CYCLE } ]
[ { CACHE [ <constant> ] } | { NO CACHE } ]
[ ; ]
参数
sequence_name
指定数据库中标识序列的唯一名称。 类型为 sysname。
RESTART [ WITH <常量> ]
序列对象返回的下一个值。 如果提供,该值 RESTART WITH 必须是小于或等于最大值且大于或等于序列对象的最小值的整数。
WITH如果省略该值,则序列号会根据原始CREATE SEQUENCE选项重新启动。
INCREMENT BY <常量>
用于递增(或递减(如果负数)序列对象每次调用 NEXT VALUE FOR 函数的基值的值。 如果增量为负值,则序列对象将降序,否则为升序。 增量不能为 0。
[ MINVALUE <常量> | NO MINVALUE ]
指定序列对象的边界。 如果 NO MINVALUE 指定,则使用序列数据类型的最小可能值。
[ MAXVALUE <常量> |NO MAXVALUE ]
指定序列对象的边界。 如果 NO MAXVALUE 指定,则使用序列数据类型的最大可能值。
[ CYCLE |NO CYCLE ]
此属性指定序列对象是否应从最小值(或降序对象的最大值)重新启动,或者在超出其最小值或最大值时引发异常。
注意
循环后,下一个值是最小值或最大值,而不是 START VALUE 序列。
[ CACHE [ <常量> ] |NO CACHE ]
通过最大限度地减少将生成的值持久保存到系统表中所需的 IO 数,可以提高使用序列对象的应用程序的性能。
有关缓存行为的详细信息,请参阅 CREATE SEQUENCE。
备注
有关如何创建序列以及如何管理序列缓存的信息,请参阅 CREATE SEQUENCE。
MINVALUE升序序列和MAXVALUE降序序列不能更改为不允许START WITH序列值的值。 若要将 MINVALUE 升序序列更改为大于 START WITH 值的数字,或将降序序列更改为 MAXVALUE 小于 START WITH 值的数字,请包含 RESTART WITH 参数,以便在位于最小值和最大范围内的所需点重新启动序列。
元数据
有关序列的信息,请查询 sys.sequences。
权限
ALTER需要对序列或ALTER架构的权限。 若要授予 ALTER 对序列的权限,请使用 ALTER ON OBJECT 以下格式:
GRANT ALTER
ON OBJECT::Test.TinySeq TO [AdventureWorks\Larry];
可以使用语句传输 ALTER AUTHORIZATION 序列对象的所有权。
审核
若要审核ALTER SEQUENCE,请监视 .SCHEMA_OBJECT_CHANGE_GROUP
示例
有关创建序列和使用 NEXT VALUE FOR 函数生成序列号的示例,请参阅 序列号。
A. 更改序列
下面的示例使用 int 数据类型(范围为 100 到 200 之间)创建一个名为 Test 的架构和一个名为 TestSeq 的序列。 序列以 125 开始,每次生成数字时递增 25。 由于序列配置为循环,当该值超过最大值 200 时,序列将以最小值 100 重新启动。
CREATE SCHEMA Test;
GO
CREATE SEQUENCE Test.TestSeq
AS INT
START WITH 125
INCREMENT BY 25
MINVALUE 100
MAXVALUE 200
CYCLE
CACHE 3;
GO
下面的示例更改 TestSeq 序列,使范围介于 50 到 200 之间。 序列以 100 重新开始编号系列,每次生成数字时递增 50。
ALTER SEQUENCE Test.TestSeq
RESTART WITH 100
INCREMENT BY 50
MINVALUE 50
MAXVALUE 200
NO CYCLE
NO CACHE;
GO
由于序列不循环,因此当序列超过 200 时, NEXT VALUE FOR 该函数将产生错误。
B. 重启序列
以下示例创建名为 <
CREATE SEQUENCE Test.CountBy1;
若要生成序列值,所有者随后应执行下列语句:
SELECT NEXT VALUE FOR Test.CountBy1;
返回的值 -9,223,372,036,854,775,808 是 bigint 数据类型的最小值。 所有者意识到他们希望序列以 1 开头,但在创建序列时未指示 START WITH 子句。 若要更正此错误,所有者应执行下面的语句。
ALTER SEQUENCE Test.CountBy1
RESTART WITH 1;
然后,所有者再次执行下列语句以生成序列号。
SELECT NEXT VALUE FOR Test.CountBy1;
数字现在是 1,与预期相符。
序列 CountBy1 是使用默认值 NO CYCLE 创建的,因此在生成数字 9,223,372,036,854,775,807 之后,它将停止运行。 对序列对象的后续调用返回错误 11728。 下面的语句将序列对象更改为循环,并将缓存设置为 20。
ALTER SEQUENCE Test.CountBy1
CYCLE
CACHE 20;
现在,当序列对象达到 9,223,372,036,854,775,807 时,它将循环,循环后的下一个编号将为此数据类型的最小值,即 -9,223,372,036,854,775,808。
所有者意识到 ,bigint 数据类型每次使用时都使用 8 个字节。 使用 4 个字节的 int 数据类型就足够了。 但是无法更改序列对象的数据类型。 若要更改为 int 数据类型,所有者必须删除序列对象,并使用正确的数据类型重新创建对象。