之前场景下,要求先去数据 Max()然后加1 分成两部操作,可以可以一步完成
——————————————————————————
CREATE SEQUENCE。
如果未指定数据类型,则序列将默认为 bigint。
使用序列
在以下情况下将使用序列,而非标识列:
-
应用程序要求在插入到表中之前有一个数值。
-
应用程序要求在多个表之间或者某个表内的多个列之间共享单个数值系列。
-
例如,在分配值 1 到 10 后,应用程序再次开始分配值 1 到 10。
-
OVER 子句确保返回的值按照 OVER 子句的 ORDER BY 子句的顺序生成。
-
调用 sp_sequence_get_range 可以一次检索该序列中的若干数值。
-
您需要更改序列的规范,例如增量值。
限制
若要防止更改序列值,请对表使用更新触发器以便回滚更改。
如果要求表中的序列值在一组表之间唯一,则创建触发器以免更新语句或序列号循环导致的重复项。
当使用 CACHE 选项创建时,意外关机(如电源故障)可能导致缓存中的序列号丢失。
此行为与 ANSI 标准保持一致。
典型用法
CREATE SEQUENCE Schema.SequenceName
AS int
START WITH 1
INCREMENT BY 1 ;
——————————————————
--Create the Test schema
CREATE SCHEMA Test ;
GO
-- Create a table
CREATE TABLE Test.Orders
(OrderID int PRIMARY KEY,
Name varchar(20) NOT NULL,
Qty int NOT NULL);
GO
-- Create a sequence
CREATE SEQUENCE Test.CountBy1
START WITH 1
INCREMENT BY 1 ;
GO
-- Insert three records
INSERT Test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.CountBy1, 'Tire', 2) ;
INSERT test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.CountBy1, 'Seat', 1) ;
INSERT test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.CountBy1, 'Brake', 1) ;
GO
-- View the table
SELECT * FROM Test.Orders ;
GO
下面是结果集:
OrderID Name Qty
1 Tire 2
2 Seat 1
3 Brake 1
在结果集中生成重复序列号
下面的示例演示序列号的两个功能:循环以及在 select 语句中使用 NEXT VALUE FOR 。
CREATE SEQUENCE CountBy5
AS tinyint
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 5
CYCLE ;
GO
SELECT NEXT VALUE FOR CountBy5 AS SurveyGroup, Name FROM sys.objects ;
GO
重置序列号
(您的版本的 AdventureWorks2012 可能会返回不同数目的结果。)执行以下语句以便使用接下来的 79 个序列号(80 到 158)。
ALTER SEQUENCE Samples.IDLabel
RESTART WITH 1 ;