漫谈SQL Server中的标识列(二)

原创 2004年10月22日 16:29:00

这篇文章主要总结一下标识列在复制中的处理方法

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数据库自增长标识列的更新修改操作方法

在日常的sql server开发中,经常会用到Identity类型的标识列作为一个表结构的自增长编号。比如文章编号、记录序号等等。自增长的标识列的引用很大程度上方便了数据库程序的开发,但有时这个固执的...
  • gongyuan303
  • gongyuan303
  • 2011年09月16日 20:51
  • 3294

SQL Server中为现有的列添加或去掉标识(Identity)属性

SQL Server中为现有的列添加或去掉标识属性   问题:   SQLServer有一个不错的常用特性,就是标识列。利用这个特性,你可以轻松地在表里为每一行创建唯一的值。添加一个新的列并...
  • poolatu
  • poolatu
  • 2013年02月22日 09:44
  • 11040

SQL-Server重置自标识列 应用

1.重置标识方法:  方法一:       使用Truncate      TRUNCATE TABLE name可以删除表内所有值并重置标识值 ,但是表内的数据将丢失。   方法二:   ...
  • chenguang79
  • chenguang79
  • 2014年06月10日 13:42
  • 864

漫谈SQL Server标识列

一、标识列的定义以及特点 SQL Server中的标识列又称标识符列,习惯上又叫自增列。 该种列具有以下三种特点: 1、列的数据类型为不带小数的数值类型 2、在进行插入(Insert)操作时,该列的值...
  • wangd1121
  • wangd1121
  • 2008年05月22日 10:46
  • 372

sqlserver 不能为表 'XXX' 中的标识列插入显 式值。

SQLSERVER中执行以下SQL报错: INSERT INTO [ERM_FUNCPRIVILEGE] ([OID], [VERSION], [AUTHORITYCODE], [AUTHORITY...
  • tanqingru
  • tanqingru
  • 2014年09月16日 17:07
  • 1366

漫谈SQL Server中的标识列

漫谈SQL Server中的标识列(一) 一、标识列的定义以及特点 SQL Server中的标识列又称标识符列,习惯上又叫自增列。 该种列具有以下三种特点: 1、列的数据类型为不带小数的数值类...
  • niuniu23_1982
  • niuniu23_1982
  • 2006年11月07日 10:47
  • 739

SQL server 无法更新标识列

无法更新标识列 怎么回事啊
  • cxp1889
  • cxp1889
  • 2016年10月03日 08:54
  • 1482

SQL SERVER重置自动编号列(标识列)

两种方法:一种是用TruncateTRUNCATE TABLE name可以删除表内所有值并重置标识值 二是用DBCC CHECKIDENTDBCC CHECKIDENT (table_name, R...
  • lanman
  • lanman
  • 2007年07月04日 10:42
  • 6195

SqlServer关闭与启用标识(自增长)列

--1.通过添加列来替换标识列 --替换法 1 --添加新列 2 ALTER TABLE TABLENAME ADD ID int 3 --赋值 4 UPDATE TABLENAME SET ID...
  • wlpz0528
  • wlpz0528
  • 2015年12月07日 11:36
  • 822

SQLserver2008 要修改表的标识列没法修改,不能在Navicat中修改标识列

在--‘工具’菜单中找到--‘选项’---在选项中---Designers--把‘阻止保存要求重新建表的更改’的“√”去掉...
  • a347911
  • a347911
  • 2016年04月27日 15:29
  • 3753
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:漫谈SQL Server中的标识列(二)
举报原因:
原因补充:

(最多只允许输入30个字)