SQL Server中新增序列技术实现主键自动增长

SQL Server中新增序列技术实现主键自动增长

1. 序言

在数据库设计中,主键的设置经常使用自增长的方式。通常我们使用IDENTITY属性实现自增长,但是IDENTITY属性有局限性。比如说,如果要对某个已有的表新加入一个自增列,这是IDENTITY属性就没法完成了。这时候就需要使用另外的方式了——序列。

2. 序列的介绍与使用

序列是一组生成唯一数字的对象,它可以用来创建自增列。序列是数据库对象,可以在数据库中创建,并且可以用在各种数据类型的列中。

序列的创建语法为:

CREATE SEQUENCE [schema_name . ] sequence_name

[ AS [ built_in_integer_type | user-defined_integer_type ] ]

[ START WITH ]

[ INCREMENT BY ]

[ { MINVALUE [ ] } | { NO MINVALUE } ]

[ { MAXVALUE [ ] } | { NO MAXVALUE } ]

[ CYCLE | { NO CYCLE } ]

[ CACHE ]

[ ; ]

下面是各参数的介绍:

- schema_name. 如果要创建的序列不在dbo架构下,可以在作为架构名称的模式名称之前指定它。

- sequence_name. 序列的名称

- built_in_integer_type. 可以是tinyint、smallint、int、bigint中的一个。

- user-defined_integer_type. 用户定义的别名、基本数据类型或CLR类型。

- START WITH. 序列的起始值。如果没有明确指定此参数,则默认为1。

- INCREMENT BY. 定义序列中的值的增量。如果没有明确指定此参数,则默认为1。

- MINVALUE. 序列中允许的最小值。如果没有指定此参数,默认最小值为tinyint、smallint、int和bigint的最小值。

- NO MINVALUE. 意味着序列中没有最小值。

- MAXVALUE. 序列中允许的最大值。如果没有指定此参数,默认最大值为tinyint、smallint、int和bigint的最大值。

- NO MAXVALUE. 意味着序列中没有最大值。

- CYCLE. 序列循环(达到最大值后,重新从最小值重新开始)。

- NO CYCLE. 序列不会循环。

- CACHE. 优化访问序列时的性能。

下面我们来看一个创建序列的实例代码:

CREATE SEQUENCE dbo.TestSequence

START WITH 1

INCREMENT BY 1

MINVALUE 1

NO MAXVALUE

CACHE 1;

3. 序列的使用

创建好了序列,我们接下来就可以把序列值赋值给表的某个列了。使用序列的语法为:

NEXT VALUE FOR sequence_name

sequence_name.NEXT VALUE

下面是一个应用序列的例子:

我们创建一个测试表来测试下,如下代码:

CREATE TABLE dbo.TestTable

(

Id INT PRIMARY KEY,

Name VARCHAR(50)

);

主键ID需要自动增长,而创建表时ID列没有设置IDENTITY属性,同时也没有数据。这时候我们可以使用序列来赋值。

我们的目标是将表中第一行的ID设置成1,然后其它行的ID逐次递增1。代码如下:

DECLARE @SeqValue INT;

SET @SeqValue = NEXT VALUE FOR dbo.TestSequence;

INSERT INTO dbo.TestTable

(

Id,

Name

)

VALUES

(

@SeqValue,

'TestName1'

);

SET @SeqValue = NEXT VALUE FOR dbo.TestSequence;

INSERT INTO dbo.TestTable

(

Id,

Name

)

VALUES

(

@SeqValue,

'TestName2'

);

SET @SeqValue = NEXT VALUE FOR dbo.TestSequence;

INSERT INTO dbo.TestTable

(

Id,

Name

)

VALUES

(

@SeqValue,

'TestName3'

);

执行完上述代码后,我们可以查询TestTable表的数据,验证执行结果:

SELECT *

FROM dbo.TestTable;

结果如下:

```

Id Name

1 TestName1

2 TestName2

3 TestName3

```

我们可以看到,通过使用序列来赋值,我们实现了主键的自增长。

4. 序列的属性

我们可以通过查询以下SQL语句来获取序列的详细信息:

SELECT * 

FROM sys.sequences

WHERE [name] = 'TestSequence'

下面是几个常用的属性:

- start_value:序列的起始值。

- increment_value:序列每次增加的值。

- minimum_value:序列下限值。

- maximum_value:序列上限值。

- is_cycling:序列是否循环。

- cache_size:序列缓存大小,指定将 PROJECT 的项作为多个序列值的块存储在内存中,以提供更快的访问。

5. 序列的删除与修改

删除一个序列:

DROP SEQUENCE [schema_name.] sequence_name [CASCADE];

修改一个序列:

ALTER SEQUENCE [schema_name.] sequence_name    

[ RESTART [ WITH ] ]

[ INCREMENT BY ]

[ MINVALUE [ ] | NO MINVALUE ]

[ MAXVALUE [ ] | NO MAXVALUE ]

[ ; ]

我们修改上面的TestSequence序列,

把序列起始值改成2,每次增加值改成2,同时序列的上下限值由默认的null设定为50。

ALTER SEQUENCE dbo.TestSequence    

RESTART WITH 2

INCREMENT BY 2

MINVALUE 2

MAXVALUE 50;

总结

序列是一种实现主键自动增长效果的方法,它对IDENTITY属性有所补充,不需要在表上设置IDENTITY属性就能实现主键自动增长。使用序列方法更加灵活,同时也非常适用于复杂的表结构。

数据库标签