为了账号安全,请及时绑定邮箱和手机立即绑定

处理SQL Server中的重复行

标签:
SQL Server

 

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

复合主键

使用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_part3HAVING  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_partsWHERE   id NOT IN ( SELECT  MIN(id)                    FROM    dbo.my_parts                    GROUP BY id_part1 ,
                            id_part2 ,
                            id_part3 );

复制代码

原文出处:https://www.cnblogs.com/ZaraNet/p/10156278.html  

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消