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的都刪除*/