SQLSERVE重复删除方法
微软SQL Server表不应包含重复的和非唯一的主键。为简单起见,在本文中我们有时称之为主键作为一个键或PK,但这总是代表主键。反复PK违反实体完整性,而不是在关系system.sql服务器允许有各种强制实体完整性、机制包括索引、唯一约束、主键约束和触发器。尽管如此,重复的主键在某些情况下可能发生;重复主键必须清除,如果这样的情况发生。一个重复的主键的情况就是非关系型数据在SQL Server PK副本和PK独特不执行当导入这些数据。另一种情况下的重复主键是数据库设计错误,如不执行每个表的实体完整性。
通常,当试图创建一个惟一索引时,会发现一个重复的PK,因为如果找到重复键,将中止创建惟一索引,并显示以下消息。
MSG 1505、级别16、状态1创建重复索引上惟一索引中止。
如果使用SQL Server 2000或SQL Server 2005,将收到以下错误消息:
MSG 1505,第16级,状态1创建唯一索引终止,因为一个重复的键,它也被称为谭,和。
本文讨论如何查找和删除表中重复的主键,但是,应仔细检查重复密钥的过程,以避免重复。
更多的信息
在这个例子中,我们将使用下面的表格,其中有一个重复的PK值。本表中的主键(col1,col2两列)。我们不能创建唯一索引或主键约束,因为这两线反复PK。这个过程演示了如何识别和删除重复的主键。
复制代码代码如下所示:
创建表T1(col1 int,int COL2,col3 char(50))
插入T1值(1, 1,数据价值)
插入T1值(1, 1,数据价值)
插入T1值(1, 2,数据值二)
第一步是确定哪些行有重复的主键值:
复制代码代码如下所示:
SELECT col1,col2,计数(*)
从T1
组COL1,COL2
具有计数(*)> 1
这将返回表中每组重复的PK值的行。这个结果的最后一列是特定PK值的重复次数。
2 COL2
一百一十二
如果只有几组重复的PK值,最好的方法是一个一个地手动删除它们:
复制代码代码如下所示:
设置行数1
删除从T1
其中2 = 1和col2 = 1
的行数值应减去1的一个给定的关键字值重复的次数。在这个例子中,有2个重复的主键,所以行数设置为1,2 / col2值来自于查询上述本集团的业绩。如果查询返回多个行组,集行查询将运行在这些行的每一行的。每次运行查询时,设置一个特定的PK值的行数重复次数减少1。
在删除行,你应该验证整个线路是重复的。虽然整个线的重复是不可能发生的,PK值可以重复,整个线路不重复。比如,一个身份证号码表的主键有两个不同的人在相同数量(线),但每个人都有独特的属性,在这种情况下,任何导致重复关键问题也可能导致线路有效和独特的数据,删除数据之前,数据应该被复制和保存研究和适当调整。
如果表中有多组完全不同的PK值,需要逐一删除它们。在这种情况下,可以使用以下方法:1。首先,通过查询运行上面的组,以确定每个组中重复的PK值和重复次数。
2。在临时表中选择重复键值:
复制代码代码如下所示:
SELECT col1,col2,col3 =数(*)
在和记
从T1
组COL1,COL2
计数(*)> 1
三.在临时表中选择重复行,以清除进程中的重复:
复制代码代码如下所示:
选择不同的t1 *
INTO holddups
从T1,和记
在t1.col1 = holdkey.col1
和t1.col2 = holdkey.col2
4,在这一点上,该holddups表应该有一个独特的PK;然而,如果T1有重复的PK和行是独一无二的,如上面的SSN的例子,这是没有的情况下。请验证是否在holddups钥匙是独一无二的,如果没有键重复的和独特的。如果是这样的话你必须停下来,确定你要保持对于一个给定的重复键值的行。例如,下面的查询:
复制代码代码如下所示:
SELECT col1,col2,计数(*)
从holddups
组COL1,COL2
1个数应返回每一行。如果结果是1,按照以下步骤5。如果不是1,这是一个独特的情况,关键是重复的,你需要决定你想救哪行。总的来说,这将需要放弃一行或创造新的独特的关键价值本线。其中一个步骤是进行这种重复的PK在holddups表。
5。删除原始表中的重复行:
复制代码代码如下所示:
删除T1
从T1,和记
在t1.col1 = holdkey.col1
和t1.col2 = holdkey.col2
6。将唯一的一行返回到原始表中:
插入T1选择*从holddups