如果表中的数据需要基于行中的多个值具有唯一约束,则适合的解决方案将是复合健。

复合主键

使用SQL Server语法创建符合主键非常简单。

create table my_parts
(
id_part1 int not null,
id_part2 int not null,
id_part3 int not null,
primary key(id_part1,id_part2,id_part3)
)
GO

在已经存在的表的情况下,通过简单的查询,复合键约束也很容易。

ALTER TABLE my_parts
  ADD PRIMARY KEY (id_part1, id_part2,id_part3);
GO

但是对于传统的现有系统,当您不允许在正在生产的系统中进行大的更改时,您必须通过简单地找到它们然后从表数据中删除它们来处理重复项。

这可能是一个真正的头痛,特别是如果现有数据对于实时系统运行至关重要

首先要找到重复的东西。

SELECT  id_part1 ,
id_part2 ,
id_part3 ,
COUNT(*) AS [count]
FROM dbo.my_parts (NOLOCK)GROUP BY id_part1 ,
id_part2 ,
id_part3
HAVING COUNT(*) > 1;

复合唯一约束

在某些情况下,您可能有一个表的主键和一个复合键。在这种情况下,查找重复的查询对你没有什么用,因为您将获得所有复合键值的重复数量,但由于主键对于每一行都是唯一的,因此您不能通过在查询中包含主键来进行分组。

要获得这样的tbale,你需要采用一种不同的方法来创建它,以防你从头开始。

CREATE TABLE my_parts
(
id INT IDENTITY(1,1) NOT NULL,
id_part1 INT NULL ,
id_part2 INT NULL ,
id_part3 INT NULL ,
PRIMARY KEY CLUSTERED (id),
CONSTRAINT [CK_my_parts] UNIQUE (id_part1,id_part2,id_part3)
);
GO

如果您正在处理现有数据库,该数据库已经包含要包含在复合唯一约束中的列值的重复项,则在添加约束之前,您需要从重复项中清除表。只有这样,您才能使用现有数据将复合唯一contrsint添加到existig表中。

DELETE  FROM dbo.my_parts
WHERE id NOT IN ( SELECT MIN(id)
FROM dbo.my_parts
GROUP BY id_part1 ,
id_part2 ,
id_part3 );

处理SQL Server中的重复行的更多相关文章

  1. SQL Server中使用PIVOT行转列

    使用PIVOT行转列 1.建表及插入数据 USE [AdventureDB] GO /****** Object: Table [dbo].[Score] Script Date: 11/25/201 ...

  2. SQL Server中删除重复数据

    delete from A ) )

  3. 在SQL Server中快速删除重复记录

     在SQL Server中快速删除重复记录 2006-07-17 21:53:15 分类: SQL Server 开发人员的噩梦——删除重复记录 想必每一位开发人员都有过类似的经历,在对数据库进行查询 ...

  4. 删除sql server中重复的数据

    原文:删除sql server中重复的数据 with list_numbers as( select Name, AuthorOrTime, Url, Price, EstimatePrice, Si ...

  5. SQL Server中关于基数估计如何计算预估行数的一些探讨

    关于SQL Server 2014中的基数估计,官方文档Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimat ...

  6. SQL Server中的小技巧(重复、替换、截取、去空格、去小数点后的位数)

    PS:随笔写的在SQL Server中要用到的 (重复.替换.截取.去空格.去小数点后的位数) /*---------------------------重复--------------------- ...

  7. 通过DBCC Page查看在SQL Server中哪行数据被锁住了?

    原文:通过DBCC Page查看在SQL Server中哪行数据被锁住了? 如何查看被锁的是哪行数据?通过dbcc page可以. 要想明白这个问题: 首先,需要模拟阻塞问题,这里直接模拟了阻塞问题的 ...

  8. SQL Server 中 ROWLOCK 行级锁

    一.ROWLOCK的使用 1.ROWLOCK行级锁确保,在用户取得被更新的行,到该行进行更新,这段时间内不被其它用户所修改.因而行级锁即可保证数据的一致性,又能提高数据操作的并发性. 2.ROWLOC ...

  9. Microsoft SQL Server中的事务与并发详解

    本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...

随机推荐

  1. CSS透明opacity和IE各版本透明度滤镜filter的准确用法

    滤镜名    说明 Alpha     让HTML元件呈现出透明的渐进效果Blur     让HTML元件产生风吹模糊的效果Chroma     让图像中的某一颜色变成透明色DropShadow    ...

  2. vagrant命令

    $ vagrant init      # 初始化 $ vagrant up        # 启动虚拟机$ vagrant halt      # 关闭虚拟机$ vagrant reload     ...

  3. Ordering犀利的比较器

    Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强.它非常容易扩展,可以轻松构造复杂的comparator,然后用在 ...

  4. netty源码分析之揭开reactor线程的面纱(二)

    如果你对netty的reactor线程不了解,建议先看下上一篇文章netty源码分析之揭开reactor线程的面纱(一),这里再把reactor中的三个步骤的图贴一下 reactor线程 我们已经了解 ...

  5. BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和

    BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和 题意:有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点, ...

  6. Error【0002】:YUM本地源配置问题

    1.1 问题背景 通过VMware workstation创建虚拟机,在虚拟机的CDROM设备中,装载操作系统镜像.然后通过mount -o loop的方式,将CDROM设备挂载到系统的/mnt/cd ...

  7. 毕业原版=[约克大学毕业证书]York原件一模一样证书

    约克大学毕业证[微/Q:2544033233◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归& ...

  8. YAML基础教程

    一.YAML介绍YAML参考了其他多种语言,包括:XML.C语言.Python.Perl以及电子邮件格式RFC2822.Clark Evans在2001年5月在首次发表了这种语言,另外Ingy döt ...

  9. Scala 枚举介绍及深入应用

    本文详细地总结了Scala枚举的几种实现方式,对我们更好地进行函数式编程有很好地指导和帮助. Scala 枚举示例和特性 枚举(Enumerations)是一种语言特性,对于建模有限的实体集来说特别有 ...

  10. AI - TensorFlow - 示例03:基本回归

    基本回归 回归(Regression):https://www.tensorflow.org/tutorials/keras/basic_regression 主要步骤:数据部分 获取数据(Get t ...