sqlserver主键重复
1. sqlserver 数据有重复怎么删除
1、必须保证表中有主键或者唯一索引,或者某列数据不能重复。只有这样,才可能使用一句SQL来实现。否则只能考虑其它办法。下面的语句,假定BB列是不重复的,删除后保存BB列值最大的那条记录。
delete
from
表
where
aa
in
(select
aa
from
表
group
by
aa
having
count(aa)
>
1)
and
bb
not
in
(select
max(bb)
from
表
group
by
aa
having
count(aa)
>
1);
2、有多种写法:
delete
A
from
B
where
A.AA
=
B.AA
delete
A
from
A,B
where
A.AA
=
B.AA
delete
A
where
AA
in
(select
AA
from
B)
3、使用into关键字:
select
*
into
新表名
from
原表
4、取数据前3位,字段必须是类似char类型,使用类似substring这样的函数(SYBASE是substring,ORACLE是substr):
select
substring(字段,1,3)
from
表名
2. sql加主键的时候因为数据里面存在重复数据,会报错,应该怎么处理
去掉重复数据,主键因为是唯一的,所以不允许有重复
3. sqlserver里面怎么删除主键为guid的重复数据
找到这个重复的GUID对应的数据,然后找出这两条数据的不同作为这两条重复的数据的唯一条件,根据这个条件删除其中不需要的一个,比如2条数据有:
guid IID 信息
a1 1 xxxxx
a1 2 xxxxx
这样就能删除 guid=a1 and IID =1 或者为2的数据了
4. 数据表sqlserver,复合主键,一个主键是姓名,一个主键是id,如果姓名重复会不会出错
不会出错,既然是复合主键,保存的时候会比较以前的主键,只有姓名和id完全相同才认为主键重复
5. sqlserver 2005 本来应该为主键的字段出现重复
-- 方式1
select fbillid,count(fbillid) from com_invsale
group by fbillid having count(fbillid)>1
-- 方式2
select * from
(
select count(fbillid) over(partition by fbillid ) c1,
t.*
from com_invsale t
) t1
where c1 > 1
-- 修改方式
这个要看一下源表中是否存在唯一的符合字段列表;如果存在,则相对简单,用update可以解决
否则相对复杂,可以参考下面的解决方法。
当SQLServer设计表的时候没有建组合字段唯一约束,以后需要增加这一约束时,却发现表里已经有了很
多重复记录了。
请看看我用的去掉SQLServer表里组合字段重复的记录方法:
假设原始表名为source_table,字段名1为field_name1,字段名2为field_name2。
(当然稍加修改也可以用到三个及以上组合字段重复的情况)
第一步: 生成组合字段重复的临时表source_p_simple
select field_name1,field_name2,count(0) as num into source_p_simple
from source_table
group by field_name1,field_name2 having count(0)>1
第二步: 生成组合字段重复的主表里完整记录的临时表source_table_p
select t1.* into source_table_p
from source_table t1,source_p_simple t2
where t1.field_name1=t2.field_name1 and t1.field_name2=t2.field_name2
第三步: 删去source_table_p里的全部重复记录
delete from source_table_p
where convert(varchar,field_name1)+convert(varchar,field_name2) in
(select convert(varchar,field_name1)+convert(varchar,field_name2)
from source_p_simple)
第四步: 生成有序列号的重复组合字段记录表source_table_p_2
select IDENTITY(int,1,1) as rowid,t1.* into source_table_p_2
from source_table_p t1
order by field_name1,field_name2,date_field_name
说明:用自动增长序列号IDENTITY(int,1,1)生成唯一的行号字段rowid
这里是按字段field_name1,field_name2,date_field_name排序,
以方便后面删除最新还是最旧时间的重复记录
当然date_field_name字段可以替换成你想要排序的字段,并可用desc选项
第五步: 删去有序列号重复组合字段记录表source_table_p_2里面的重复记录
delete from source_table_p_2
where rowid in (select min(rowid) from source_table_p_2
group by field_name1,field_name2 having count(*)>1)
(所影响的行数为 5586 行)
delete from source_table_p_2
where rowid in (select min(rowid) from source_table_p_2
group by field_name1,field_name2 having count(*)>1)
(所影响的行数为 1108 行)
...... ......
delete from source_table_p_2
where rowid in (select min(rowid) from source_table_p_2
group by field_name1,field_name2 having count(*)>1)
(所影响的行数为 0 行)
注意:上面这条删除的SQL要执行一到多次,因为组合字段重复记录可能一条以上,
一直到它(所影响的行数为 0 行)才算彻底删除干净重复记录。
我这里是保留重复记录里时间字段date_field_name最新的记录。
第六步: 把剩下的没有重复的记录插回原始表
insert into source_table(field_name1,field_name2,.....)
select field_name1,field_name2,...... from source_table_p_2
简单方法:
1、建立一个与当前表结构完全一致临时表
2、用distinct关键字,将当前表中数据导入到临时表
3、删除当前表数据
4、从临时表将数据存回当前表
begin tran
select distinct * into #t from YOUR_TABLE
trancate table YOUR_TABLE
insert into YOUR_TABLE
select * from #t
if @@error<>0
begin
rollback tran
drop table #t
return
end
commit tran
drop table #t
6. sqlserver 有个2个相同主键 为何不报错
首先:看看是否是组合键
其次:select distinct 主键字段 from 表,判断是否这个值是相同的
其次:主键是否建了,看看主键是否有生效
insert into t values(2,1..); --插入两行相同的值试试看
最后:you know!
7. SQL server 固定条件下 删除重复数据
MicrosoftSQLServer表不应该包含重复行和非唯一主键。为简洁起见,在本文中我们有时称主键为“键”或“PK”,但这始终表示“主键”。重复的PK违反了实体完整性,在关系系统中是不允许的。SQLServer有各种强制执行实体完整性的机制,包括索引、唯一约束、主键约束和触发器。尽管如此,在某些情况下还可能会出现重复的主键;如果出现此类情况,就必须清除重复主键。出现重复主键的情形之一是,在SQLServer外部的非关系数据中存在重复的PK,在导入这些数据时没有强制执行PK唯一性。出现重复主键的另一种情形来自数据库设计错误,如没有对每张表强制执行实体完整性。通常在尝试创建唯一索引时会发现重复的PK,因为如果找到重复的键,唯一索引的创建即会中止,并且将显示以下消息:Msg1505,Level16,.如果使用的是SQLServer2000或SQLServer2005,则会收到以下错误消息:Msg1505,Level16,me'%.*ls'andindexname'%.*ls'.Theplicatekeyvalueis%ls.createtablet1(col1int,col2int,col3char(50))insertintot1values(1,1,'datavalueone')insertintot1values(1,1,'datavalueone')insertintot1values(1,2,'datavaluetwo')SELECTcol1,col2,count(*)FROMt1GROUPBYcol1,col2HAVINGcount(*)1这将为表中的每组重复的PK值返回一行。此结果中的最后一列是特定PK值的重复数。col1col2112如果只有几组重复的PK值,则最佳方法是手动逐个删除它们。例如:=1andcol2=1rowcount值应该是给定键值的重复数减去1。在该示例中,有2个重复的主键,所以rowcount被设置为1。col1/col2值来自上面的GROUPBY查询结果。如果GROUPBY查询返回多行,则“setrowcount”查询将必须为这些行中的每一行各运行一次。每次运行该查询时,将rowcount设置为特定PK值的重复数减去1。在删除行之前,您应该验证是否整行重复。虽然整行重复不太可能发生,但可能PK值重复,而整行不重复。例如一个将身份证号码作为主键的表,该表有两个具有相同号码的不同的人(即行),但每个人有唯一的属性。在这种情况下,任何引起重复键的问题可能还引起在行中放入有效的唯一的数据。在删除该数据之前,应该将该数据复制出来并保存下来以进行研究和适当的调整。
8. sqlserver复合主键的问题,其中的一个键值是可以重复的,我想将只用这个键作为另一个表的外键,可有办法
这个好像不行,做外键的话要求主键具有唯一约束,没试过用复合主键做外键的
9. sqlserver以主键为基准去重
DELETEa
FROMtable1a
(
SELECT*,ROW_NUMBER()OVER(PARTITIONBYguid/*同一guid*/ORDERBYcolumn1DESC/*NEWID()不能随机保留因为有完全重复的数据可能会被清空*/)n
FROMtable1b
)xONa.guid=x.guidANDa.column1=x.column1ANDa.column2=x.column2ANDa.column3=x.column3
WHEREx<>1/*保留n=1的那条数据即n<>1的都删除*/