`

谈SQL Server标识列

阅读更多

一、标识列的定义以及特点

SQL Server中的标识列又称标识符列,习惯上又叫自增列。
该种列具有以下三种特点:

1、列的数据类型为不带小数的数值类型
2、在进行插入(Insert)操作时,该列的值是由系统按一定规律生成,不允许空值
3、列值不重复,具有标识表中每一行的作用,每个表只能有一个标识列。

由于以上特点,使得标识列在数据库的设计中得到广泛的使用。

二、标识列的组成
创建一个标识列,通常要指定三个内容:
1、类型(type)
在SQL Server 2000中,标识列类型必须是数值类型,如下:
decimal、int、numeric、smallint、bigint 、tinyint 
其中要注意的是,当选择decimal和numeric时,小数位数必须为零
另外还要注意每种数据类型所有表示的数值范围

2、种子(seed)
是指派给表中第一行的值,默认为1

3、递增量(increment)
相邻两个标识值之间的增量,默认为1。

三、标识列的创建与修改
标识列的创建与修改,通常在企业管理器和用Transact-SQL语句都可实现,使用企业管理管理器比较简单,请参考SQL Server的联机帮助,这

里只讨论使用Transact-SQL的方法

1、创建表时指定标识列
标识列可用 IDENTITY 属性建立,因此在SQL Server中,又称标识列为具有IDENTITY属性的列或IDENTITY列。
下面的例子创建一个包含名为ID,类型为int,种子为1,递增量为1的标识列
CREATE TABLE T_test
(ID int IDENTITY(1,1),
 Name varchar(50)


2、在现有表中添加标识列
下面的例子向表T_test中添加一个名为ID,类型为int,种子为1,递增量为1的标识列
--创建表
CREATE TABLE T_test
(Name varchar(50)


--插入数据
INSERT T_test(Name) VALUES(’张三’)

--增加标识列
ALTER TABLE T_test
ADD ID int IDENTITY(1,1)

3、判段一个表是否具有标识列

可以使用 OBJECTPROPERTY 函数确定一个表是否具有 IDENTITY(标识)列,用法:
Select OBJECTPROPERTY(OBJECT_ID(’表名’),’TableHasIdentity’)
如果有,则返回1,否则返回0

4、判断某列是否是标识列

可使用 COLUMNPROPERTY 函数确定 某列是否具有IDENTITY 属性,用法
SELECT COLUMNPROPERTY( OBJECT_ID(’表名’),’列名’,’IsIdentity’)
如果该列为标识列,则返回1,否则返回0

5、查询某表标识列的列名
SQL Server中没有现成的函数实现此功能,实现的SQL语句如下
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.columns
   WHERE TABLE_NAME=’表名’ AND  COLUMNPROPERTY(      
      OBJECT_ID(’表名’),COLUMN_NAME,’IsIdentity’)=1

6、标识列的引用

如果在SQL语句中引用标识列,可用关键字IDENTITYCOL代替
例如,若要查询上例中ID等于1的行,
以下两条查询语句是等价的
SELECT * FROM T_test WHERE IDENTITYCOL=1
SELECT * FROM T_test WHERE ID=1

7、获取标识列的种子值

可使用函数IDENT_SEED,用法:
SELECT IDENT_SEED (’表名’) 

8、获取标识列的递增量

可使用函数IDENT_INCR ,用法:
SELECT IDENT_INCR(’表名’) 

9、获取指定表中最后生成的标识值

可使用函数IDENT_CURRENT,用法:
SELECT IDENT_CURRENT(’表名’) 
注意事项:当包含标识列的表刚刚创建,为经过任何插入操作时,使用IDENT_CURRENT函数得到的值为标识列的种子值,这一点在开发数据库应用程序的时候尤其应该注意。

总结一下标识列在复制中的处理方法

1、快照复制
   在快照复制中,通常无须考虑标识列的属性。

2、事务复制
   举例:
   发布数据库A,订阅数据库B,出版物为T_test_A,订阅表为T_test_B
   CREATE TABLE T_test_A
 (ID int IDENTITY(1,1),
  Name varchar(50)
 )
   CREATE TABLE T_test_B
 (ID int IDENTITY(1,1),
  Name varchar(50)
 )
    
   在这种情况下,复制代理将无法将新行复制到库B,因为列ID是标识列,不能给标识列显示提供值,复制失败。
   这时,需要为标识列设置NOT FOR REPLICATION 选项。这样,当复制代理程序用任何登录连接到库B上的表T_test时,该表上的所有 NOT
   FOR REPLICATION 选项将被激活,就可以显式插入ID列。

   这里分两种情况:
   1、库B的T_test表不会被用户(或应用程序)更新
   最简单的情况是:如果库B的T_test不会被用户(或应用程序)更新,那建议去掉ID列的标识属性,只采用简单int类型即可。

   2、库B的T_test表是会被其他用户(或应用程序)更新

   这种情况下,两个T_test表的ID列就会发生冲突,举例:
   在库A中执行如下语句:
   INSERT T_test_A(Name) VALUES(’Tom’)(假设ID列为1)
   在库B中执行如下语句:
   INSERT T_test_B(Name) VALUES(’Pip’)(假设ID列为1)
   这样,就会在库A和库B的两个表分别插入一条记录,显然,是两条不同的记录。
   然而事情还没有结束,待到预先设定的复制时间,复制代理试图把记录"1 TOM"插入到库B中的T_test表,但库B的T_test_B表已经存在

ID为1的列,插入不会成功,通过复制监视器,我们会发现复制失败了。
   解决以上问题的方法有:
  (1)为发布方和订阅方的标识列指定不同范围的值,如上例可修改为:
     --确保该表记录不会超过10000000
     CREATE TABLE T_test_A
 (ID int IDENTITY(1,1),
  Name varchar(50)
 )
   CREATE TABLE T_test_B
 (ID int IDENTITY(10000000,1),
  Name varchar(50)
 )
   (2)使发布方和订阅方的标识列的值不会重复, 如
     --使用奇数值
     CREATE TABLE T_test_A
 (ID int IDENTITY(1,2),
  Name varchar(50)
 )
     --使用偶数值
     CREATE TABLE T_test_B
 (ID int IDENTITY(2,2),
  Name varchar(50)
 )
    这种办法可推广,当订阅方和发布方有四处时,标识列属性的定义分别如下
    (1,4),(2,4),(3,4),(4,4)

3、合并复制
   采用事务复制中解决方法,只要使发布表和订阅表标识列的值不重复既可。

 

 

在使用SQL Server中我们经常会使用标识列来做主键,一般情况下我们都将标识列设置成int类型,然后设置标识种子和增量。

      但是如果数据库中的数据过大,那么int类型数据可能不够用,改怎么办呢?

      在SQL Server中有一种数据类型UniqueIdentifier类型,该类型存储16字节的二进制值,为该列分配必须具有的唯一的标识符,因此该列的数值不可能存在重复,因此也可以作为主键来使用。

      据说这种数据类型是更具当前时间和服务器网卡地址随机生成,100万年之内不会出现重复的值,看来足够我们使用了。哈哈哈。

      设置某列的值为UniqueIdentifier类型,为非即可。

     

创建表格时某列的类型为uniqueidentifier代码 复制代码
  1. CREATE TABLE Test(   
  2.     [id] [uniqueidentifier] NOT NULL,   
  3.     [name] [varchar](20) NOT NULL,   
  4.     [comm] [varchar](100)   
  5. )  
CREATE TABLE Test(
	[id] [uniqueidentifier] NOT NULL,
	[name] [varchar](20) NOT NULL,
	[comm] [varchar](100)
)

 

 

 

      然后插入数据的时候使用newID()函数插入数据即可。

     

使用newid()函数为该列赋值代码 复制代码
  1. insert into Test values(newID(),'TestForMe','This is just a test')  
insert into Test values(newID(),'TestForMe','This is just a test')

      看看执行以后的结果,这样生成的标识列如论如何也不会有重复,而且相信对我们的系统来说,够用了。呵呵。

分享到:
评论

相关推荐

    标识列与普通列相互转换示例

    标识列与普通列相互转的示例 --创建测试表 CREATE TABLE t1(ID int IDENTITY,A int) GO --插入记录 INSERT t1 VALUES(1) GO --1. 将IDENTITY(标识)列变为普通列 ALTER TABLE t1 ADD ID_temp int GO UPDATE t1 SET ...

    SQLServer-让标识列重新开始计算

    ### SQL Server - 让标识列重新开始计算 在SQL Server中,标识列(Identity Column)是一种自增型字段,常用于自动为表中的记录分配唯一的序列号。这在创建主键或唯一索引时非常有用,尤其是在需要为新记录自动分配...

    SQL Server修改标识列方法 如自增列的批量化修改

    代码如下: –允许对系统表进行更新 exec sp_configure ‘allow updates’,1 reconfigure with override GO –取消标识列标记 update syscolumns set colstat = 0 where id = object_id(‘tablename’) and colstat ...

    SQL server列自动增加方法

    这个特性在SQL Server中被称为“标识列”(Identity Column)。下面我们将详细讲解如何设置和使用SQL Server列的自动增加功能。 1. **标识列的定义**: 标识列是一种特殊类型的整数列,其值由SQL Server自动递增。...

    SQL SERVER中自动标识列的改进.pdf

    "SQL SERVER中自动标识列的改进" 本文讨论了SQL SERVER中自动标识列的两大限制:一是初始值只能是整型的数据,无法使用文本型数据或包含前导零的文本型数据;二是删除表中的记录或删除记录后再插入记录将导致表中的...

    kepserver读取SQL Server数据库

    在这里,你需要定义DSN(Data Source Name),这可以是任意名称,用于标识你要连接的SQL Server。在描述中,可以输入简短说明,便于记忆。首次连接时,输入SQL Server所在的计算机IP地址。然后,选择"使用用户输入...

    SQL SERVER 2005/2008 Express Profiler

    SQL Server 2005/2008 Express Profiler 是微软SQL Server数据库管理系统中一个强大的性能监视工具,尤其适用于SQL Server 2008 Express版本。它允许开发者和DBA(数据库管理员)深入地洞察数据库系统的运行情况,...

    SQL Server手工插入标识列的方法

    如果我们在标识列中插入值,例如: 代码如下:insert member(id,username) values(10,’admin’) 则在查询分析器里面会返回错误信息: [plain] 引用内容 服务器: 消息 544,级别 16,状态 1,行 1 当 IDENTITY_...

    SqlServer查看表结构

    本篇文章将深入解析“SqlServer查看表结构”的方法,以及如何利用SQL语句来获取详细的表结构信息,这对于数据库管理员(DBA)、数据分析师、软件开发者等专业人士来说尤为关键。 ### SQL Server查看表结构的重要性 ...

    Sql修改标示列的方法

    在Microsoft SQL Server中,为了修改标识列,首先需要启用对系统表的更新权限。这是因为标识列的信息存储在系统表`syscolumns`中,而默认情况下,用户是不允许直接更新这些系统表的。启用更新权限可以通过以下步骤...

    SQL SERVER 自增列

    SQL SERVER 自增列,也称为标识列,是数据库设计中常用的一种特性,特别是在关系型数据库管理系统如SQL Server中。自增列通常用作主键的一部分,自动递增其值,为新插入的每一行提供一个唯一的标识。这极大地方便了...

    SQL server大作业

    在本“SQL Server大作业”中,我们主要探讨的是如何使用SQL Server进行数据库的设计与实现。这个作业可能包括了从需求分析、概念模型设计、逻辑结构设计到物理结构设计的全过程,同时也涉及到SQL语言的使用,如数据...

    SQL Server 之 SET IDENTITY_INSERT

    在SQL Server中,`SET IDENTITY_INSERT`是一个重要的命令,它主要用于处理标识列(即自动编号列,通常由`IDENTITY`关键字定义)的显式赋值问题。默认情况下,当向一个包含`IDENTITY`属性的表中插入数据时,标识列的...

    sqlserver使用UNPIVOT函数列转行

    ### SQL Server 使用 UNPIVOT 函数实现列转行 #### 概述 在 SQL Server 中,`UNPIVOT` 函数是一个非常实用的功能,主要用于将数据表中的列转换为行,即“列转行”操作。这种操作在数据分析过程中经常用到,尤其是...

    SQL Server2005基本方法和语句

    主键是表中用于唯一标识每条记录的一列或一组列。可以使用以下语句添加或删除主键: - 添加主键: ```sql ALTER TABLE tabname ADD PRIMARY KEY (col); ``` - 删除主键: ```sql ALTER TABLE tabname DROP ...

    SqlServer数据库的数据类型

    ### SqlServer数据库的数据类型详解 数据类型在编程与数据库管理中扮演着至关重要的角色,它不仅定义了数据的存储方式,还决定了数据可以执行的操作。SQL Server作为一种广泛使用的数据库管理系统,提供了丰富的...

    CDC操作Sqlserver2008

    ### CDC操作Sqlserver2008 #### 概述 变更数据捕获(Change Data Capture,简称CDC)是SQL Server的一项重要功能,主要用于记录数据库表中的数据更改历史。这一功能在进行数据分析、日志记录、数据复制等场景下...

    战胜SQL Server必做练习50题

    - 主键(Primary Key):表中唯一标识一行数据的列,不允许有重复值。 - 外键(Foreign Key):用于建立表间关联的列,参照主键所在的表。 2. **SQL查询语句** - SELECT:用于从数据库中选取数据,是最基本的...

    使用PowerDesigner设计SQL Server数据库

    - **设置“标识列”**(自动增长):指定某些字段为自动增长字段,以便在插入新记录时自动分配唯一值。 - **设置“默认值”**:为字段设置默认值,当插入新记录时如果没有明确指定值,则采用默认值。 - **设置...

Global site tag (gtag.js) - Google Analytics