文章编号: 139444 - 最后修改: 2006年3月3日 - 修订: 4.1 如何删除 SQL Server 表中的重复行概要
Microsoft SQL Server 表不应该包含重复行和非唯一主键。为简洁起见,在本文中我们有时称主键为“键”或“PK”,但这始终表示“主键”。重复的 PK 违反了实体完整性,在关系系统中是不允许的。SQL Server 有各种强制执行实体完整性的机制,包括索引、唯一约束、主键约束和触发器。 尽管如此,在某些情况下还可能会出现重复的主键;如果出现此类情况,就必须清除重复主键。出现重复主键的情形之一是,在 SQL Server 外部的非关系数据中存在重复的 PK,在导入这些数据时没有强制执行 PK 唯一性。出现重复主键的另一种情形来自数据库设计错误,如没有对每张表强制执行实体完整性。 通常在尝试创建唯一索引时会发现重复的 PK,因为如果找到重复的键,唯一索引的创建即会中止,并且将显示以下消息:
Msg 1505, Level 16, State 1 Create unique index aborted on duplicate key.
Msg 1505, Level 16, State 1 CREATE UNIQUE INDEX terminated because a duplicate key was found for object name '%.*ls' and index name '%.*ls'.The duplicate key value is %ls.
更多信息
在该示例中,我们将使用下表,它具有重复的 PK 值。在该表中,主键是两列(col1、col2)。我们无法创建唯一索引或主键约束,因为这两行具有重复的 PK。该过程演示如何识别和删除重复的主键。
收起该表格
如果只有几组重复的 PK 值,则最佳方法是手动逐个删除它们。例如: 在删除行之前,您应该验证是否整行重复。虽然整行重复不太可能发生,但可能 PK 值重复,而整行不重复。例如一个将身份证号码作为主键的表,该表有两个具有相同号码的不同的人(即行),但每个人有唯一的属性。在这种情况下,任何引起重复键的问题可能还引起在行中放入有效的唯一的数据。在删除该数据之前,应该将该数据复制出来并保存下来以进行研究和适当的调整。 如果表中有多组完全不同的重复的 PK 值,则逐个删除它们会很费时间。在这种情况下,可使用下面的方法:
这篇文章中的信息适用于:
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。 | 文章翻译
|
回到顶端
