Làm th? nào đ? lo?i b? trùng l?p hàng t? m?t bàn trong SQL Server

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 139444 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

TÓM T?T

Microsoft SQL Server b?ng không bao gi? nên ch?a hàng trùng l?p, c?ng không không duy nh?t phím chính. Cho ng?n g?n, đôi khi chúng tôi s? đ? c?p đ?n chính phím như "khóa" ho?c "PK" trong bài này, nhưng đi?u này s? luôn luôn bi?u th? "chính baám giö? phím." Trùng l?p PKs là m?t s? vi ph?m c?a toàn v?n th?c th?, và nên không đư?c phep trong m?t quan h? th?ng. SQL Server có cơ ch? khác nhau cho th?c thi toàn v?n th?c th?, trong đó có ch? s?, nh?ng h?n ch? duy nh?t, KHÓA chính khó khăn, và gây nên.

M?c dù v?y, trong trư?ng h?p b?t thư?ng trùng l?p phím chính có th? t?n t?i, và n?u như v?y h? ph?i đư?c lo?i b?. Có m?t cách h? th? x?y ra là n?u trùng l?p PKs t?n t?i trong d? li?u không quan h? bên ngoài SQL Server, và d? li?u là nh?p kh?u trong khi tính đ?c đáo PK không đư?c thi hành. M?t cách khác đ? h? có th? x?y ra là thông qua m?t l?i thi?t k? cơ s? d? li?u, ch?ng h?n như là không th?c thi th?c th? toàn v?n trên m?i b?ng.

Thư?ng trùng l?p PKs đư?c nh?n th?y khi b?n c? g?ng t?o ra m?t ch? s? duy nh?t, mà s? h?y b? n?u trùng l?p phím đư?c t?m th?y. Thư này là:
Msg 1505, c?p 16, bang 1 T?o ch? m?c duy nh?t b? b? d? trùng l?p phím.
N?u b?n đang s? d?ng SQL Server 2000 ho?c SQL Server 2005, b?n có th? nh?n đư?c thông báo l?i sau:
Msg 1505, c?p 16, bang 1 t?o đ?c đáo INDEX ch?m d?t v? m?t trùng l?p phím đư?c t?m th?y cho tên đ?i tư?ng ' %. * ls' và ch? s? tên ' %. * ls'. Giá tr? key trùng l?p là % ls.
Bài vi?t này th?o lu?n v? làm th? nào đ? xác đ?nh v? trí và lo?i b? trùng l?p phím chính t? m?t b?ng. Tuy nhiên, b?n nên ki?m tra ch?t ch? quá tr?nh mà cho phép các li?u x?y ra đ? ngăn ng?a tái phát.

THÔNG TIN THÊM

Ví d? này, chúng tôi s? s? d?ng b?ng sau đây v?i giá tr? PK trùng l?p. Trong b?ng này chính là hai c?t (col1, col2). Chúng tôi không th? t?o ra m?t ch? m?c duy nh?t ho?c h?n ch? khóa chính k? t? khi hai hàng có PKs trùng l?p. Th? t?c này minh ho? cách nh?n bi?t và lo?i b? các b?n sao.
create table t1(col1 int, col2 int, col3 char(50))
insert into t1 values (1, 1, 'data value one')
insert into t1 values (1, 1, 'data value one')
insert into t1 values (1, 2, 'data value two')
				
Bư?c đ?u tiên là đ? xác đ?nh đó hàng có trùng l?p giá tr? chính ch? ch?t:
SELECT col1, col2, count(*)
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1
				
Đi?u này s? tr? v? m?t hàng cho m?i b? trùng l?p PK giá tr? trong b?ng. Các c?t qua theo k?t qu? này là s? lư?ng b?n sao cho các c? th? PK giá tr?.

Thu g?n b?ng nàyBung r?ng b?ng này
col1col2
112


N?u có ch? m?t vài b? c?a trùng l?p PK giá tr?, các th? t?c t?t nh?t là đ? xóa này b?ng tay trên cơ s? cá nhân. Ví dụ:
set rowcount 1
delete from t1
where col1=1 and col2=1
				
Giá tr? rowcount nên là n-1 s? li?u cho m?t giá tr? quan tr?ng nh?t đ?nh. Trong ví d? này, có 2 b?n sao như v?y rowcount đư?c thi?t l?p đ? 1. Các giá tr? col1/col2 đư?c l?y t? ? trên nhóm b?i truy v?n qu?. N?u truy v?n nhóm b?i tr? v? nhi?u hàng, "thi?t l?p rowcount" truy v?n s? ph?i đư?c ch?y m?t l?n cho m?i c?a các hàng. M?i khi nó đư?c đi?u hành, đ?t rowcount n-1 s? li?u c?a giá tr? PK c? th?.

Trư?c khi xóa các hàng, b?n nên ch?c ch?n r?ng toàn b? hàng có l?p l?i. Trong khi không, nó có th? là giá tr? PK là trùng l?p, Tuy nhiên, không ph?i là hàng như m?t toàn th?. M?t ví d? v? đi?u này s? là m?t b?ng v?i S? an sinh x? h?i như khóa chính, và có hai ngư?i khác nhau (ho?c hàng) v?i cùng m?t s?, m?i có thu?c tính duy nh?t. Trong đó m?t trư?ng h?p b?t k? s? c? gây ra ch?a khóa trùng l?p có th? đ? gây ra c?ng d? li?u duy nh?t h?p l? ph?i đư?c đ?t trong hàng. D? li?u này nên sao chép và b?o qu?n cho nghiên c?u và có th? h?a gi?i trư?c khi đ? xóa d? li?u.

N?u không có nhi?u khác bi?t t?p h?p các giá tr? PK trùng l?p trong b?ng, nó có th? đư?c quá t?n th?i gian đ? lo?i b? chúng riêng r?. Trong trư?ng h?p này các theo th? t?c có th? đư?c s? d?ng:
  1. Trư?c tiên, ch?y truy trên nhóm b?i v?n đ? xác đ?nh có bao nhiêu b? trùng l?p PK giá tr? t?n t?i, và s? đ?m b?n sao cho m?i t?p.
  2. Ch?n các giá tr? quan tr?ng trùng l?p vào m?t b?ng đang n?m gi?. Ví dụ:
    SELECT col1, col2, col3=count(*)
    INTO holdkey
    FROM t1
    GROUP BY col1, col2
    HAVING count(*) > 1
    					
  3. Ch?n các hàng trùng l?p vào m?t b?ng đang n?m gi?, lo?i b? b?n sao trong quá tr?nh. Ví dụ:
    SELECT DISTINCT t1.*
    INTO holddups
    FROM t1, holdkey
    WHERE t1.col1 = holdkey.col1
    AND t1.col2 = holdkey.col2
    					
  4. T?i th?i đi?m này, b?ng holddups nên có duy nh?t PKs, tuy nhiên, đi?u này s? không là các trư?ng h?p n?u t1 có trùng l?p PKs, nhưng đ?c đáo hàng (như trong ví d? SSN trên). Ki?m ch?ng r?ng m?i chính trong holddups là duy nh?t, và b?n không có ch?a khóa trùng l?p, nhưng đ?c đáo hàng. N?u như v?y, b?n ph?i d?ng l?i ? đây và ti?n hành hoà gi?i mà hàng b?n mu?n gi? m?t giá tr? nh?t đ?nh key trùng l?p. Ví d?, truy v?n:
    SELECT col1, col2, count(*)
    FROM holddups
    GROUP BY col1, col2
    						
    nên tr? v? m?t s? 1 cho m?i d?ng. N?u có, ti?n hành bư?c 5 dư?i đây. N?u không, b?n có trùng l?p phím, nhưng đ?c đáo hàng và c?n ph?i quy?t đ?nh mà hàng đ? ti?t ki?m. Đi?u này thư?ng s? gây discarding liên ti?p, ho?c t?o m?t giá tr? duy nh?t quan tr?ng m?i cho d?ng này. M?t m?t trong nh?ng bư?c hai cho m?i như v?y PK trùng l?p trong b?ng holddups.
  5. Xóa các hàng trùng l?p t? ban đ?u b?ng. Ví dụ:
    DELETE t1
    FROM t1, holdkey
    WHERE t1.col1 = holdkey.col1
    AND t1.col2 = holdkey.col2
    					
  6. Đ?t hàng duy nh?t l?i trong b?ng g?c. Ví dụ:
    INSERT t1 SELECT * FROM holddups
    					

Thu?c tính

ID c?a bài: 139444 - L?n xem xét sau cùng: 17 Tháng Chín 2011 - Xem xét l?i: 3.0
Áp d?ng
  • Microsoft SQL Server 6.0 Standard Edition
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Workgroup Edition
T? khóa: 
kbsqlsetup kbinfo kbusage kbmt KB139444 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:139444

Cung cấp Phản hồi

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com