新闻  |   论坛  |   博客  |   在线研讨会
创建表 (Transact SQL) IDENTITY (属性)
luker | 2017-04-10 09:53:28    阅读:1549   发布文章
语法
  
IDENTITY [ (seed , increment) ]  

参数

种子
加载到表中的第一个行所使用的值。

增量
与前一个加载的行的标识值相加的增量值。

必须同时指定种子和增量,或者二者都不指定。 如果二者都未指定,则取默认值 (1,1)。

備註

标识列可用于生成键值。 列上的标识属性确保:

  • 每个新值都基于当前种子和增量而生成。

  • 特定事务的每个新值不同于表上的其他并发事务的新值。

列上的标识属性不确保:

  • 值的唯一性– 必须使用强制唯一性主键或UNIQUE约束或UNIQUE索引。

  • 在事务中的连续值– 不能保证事务插入多行获得行的连续值,因为其他并发插入可能发生在表上。 如果值必须是连续,则事务应该对表使用的排他锁,或使用SERIALIZABLE隔离级别。

  • 之后重新启动服务器或其他故障导致的连续值–SQL Server可能缓存标识值,出于性能原因,并可能在数据库故障或服务器重新启动期间丢失某些分配的值。 这可能导致在插入时标识值之间有间隔。 如果不允许有间隔,应用程序应使用自己的机制来生成键值。 使用与序列生成器NOCACHE选项可以限制事务永远不会提交的缺口。

  • 重用值-具有特定种子/递增,标识值不会重新使用引擎的给定的标识属性。 如果特定 insert 语句失败或回滚该 insert 语句,则使用的标识值会丢失,且不会重新生成。 这可能导致在生成后续标识值时引入间隔。

这些限制是为了提升性能而在设计中加入的,而且在大多数情形下是可接受的。 如果您因为这些限制而不能使用标识值,则可以创建一个包含当前值的独立表,并使用您的应用程序管理对该表的访问和数字分配。

如果发布了包含标识列的表以进行复制,则必须使用与所用复制类型对应的方式来管理标识列。 有关详细信息,请参阅复制标识列。

每个表只能创建一个标识列。

在内存优化表中,种子和增量必须分别设置为 1、1。 设置种子或增量为 1 会导致以下错误以外的值︰ 使用种子和增量值其他不是内存优化表不支持 1。

示例
A. 将 IDENTITY 属性与 CREATE TABLE 一起使用

以下示例将创建一个新表,该表使用 IDENTITY 属性来生成自动递增的标识号。

USE AdventureWorks2012;  
  
IF OBJECT_ID ('dbo.new_employees', 'U') IS NOT NULL  
   DROP TABLE new_employees;  
GO  
CREATE TABLE new_employees  
(  
 id_num int IDENTITY(1,1),  
 fname varchar (20),  
 minit char(1),  
 lname varchar(30)  
);  
  
INSERT new_employees  
   (fname, minit, lname)  
VALUES  
   ('Karin', 'F', 'Josephs');  
  
INSERT new_employees  
   (fname, minit, lname)  
VALUES  
   ('Pirkko', 'O', 'Koskitalo');  

参与讨论
登录后参与讨论
推荐文章
最近访客