2010-05-21 47 views
5

Ngoại lệ:Vi phạm chế KEY UNIQUE trên null

Violation of UNIQUE KEY constraint 'UQ__user_dat__AB6E61641273C1CD'. Cannot insert duplicate key in object 'dbo.user_data'. 
The statement has been terminated. 

AB6E61641273C1CD = email mà là duy nhất và NULL

tuyên bố My SQL KHÔNG chèn một giá trị cho email. Vì vậy, tôi giả sử nó sẽ có mặc định là null (mặc dù tôi không bao giờ viết một tuyên bố mặc định (null) khi tạo bảng).

Sự cố là gì? Các mã làm việc trong sqlite hoàn hảo.

+0

SQL Server 2008? 2005? – gbn

+0

tôi sẽ sử dụng sql 08 nhiều khả năng là –

Trả lời

5

Nếu bạn muốn một khóa duy nhất bỏ qua lỗi không thể thực hiện trong SQL Server. Tuy nhiên this article mô tả cách bạn có thể nhận được rằng hành vi qua

  • Một lập chỉ mục - xem với một mệnh đề where mà loại bỏ null
  • tính cột - Hạn chế là một tuyên bố trường hợp đó chuyển đổi null vào PK
  • một cò - cò không là một hạn chế duy nhất không nhưng bỏ qua null
  • bình thường - Đặt các dữ liệu trong bảng khác nơi hàng không tồn tại cho nulls

Ngoài ra AlexKuznestov's ghi chú trả lời rằng trong SQL 2008 bạn có thể cung cấp chỉ mục đã lọc.

Tốt nhất trong số này là chế độ xem được lập chỉ mục nhưng giống như trình kích hoạt, sự tồn tại của nó không phải lúc nào cũng rõ ràng. Cột tính toán là thú vị nhưng bạn sẽ cần phải có khả năng đảm bảo rằng dữ liệu thực tế không bao giờ đụng độ với cột mà bạn đang "thêm".

1

một hạn chế duy nhất chỉ cho phép 1 giá trị null trong SQL Server, Oracle ví dụ cho phép nhiều NULLS

dụ

create table test (id int) 


CREATE UNIQUE NONCLUSTERED INDEX [IX_test] ON [dbo].[test] 


insert test values(NULL) 

--will fail 
insert test values(NULL) 

Msg 2601, Level 14, State 1, Line 1 Không thể chèn khóa trùng lặp hàng trong đối tượng 'dbo.test' với chỉ mục duy nhất 'IX_test'. Tuyên bố đã bị chấm dứt.

+1

WTF! Sau đó .... WTF! Những gì tôi có thể làm như một workaround?Không sử dụng duy nhất!?! mặc dù tôi cần (tức là thi hành bằng tay) –

0

Có thể bạn đã có hàng có null trong cột email.

1

SQL Menace chính xác 100% nếu bạn đặt khóa duy nhất trên cột nhưng chỉ cho phép giá trị rỗng trong một cột cho tất cả các hàng trong bảng.

Ví dụ:

Column with unique key 
1 
2 
3 
NULL 
4 

Để giữ cho cột duy nhất tôi có thể nhập bất cứ điều gì nhưng 1,2,3,4, hoặc NULL

+0

điều này được cho phép trong các cơ sở dữ liệu khác ...... xem bình luận trong bài đăng SQL Menace. –

+0

vâng nó là nhưng Vì bài viết được gắn thẻ với SQL-Server, tôi cho rằng anh ta muốn có một sự khám phá về cách SQL-Server xử lý UNIQUE KEYS –

5

Mở SQL Server 2008, bạn có thể sử dụng một chỉ số lọc để thay thế. SQL Server 2005, sử dụng chế độ xem được lập chỉ mục.

+0

+1, tôi sẽ đề xuất –

+0

+1 Chỉ cần kiểm tra chỉ số đã lọc, nó hoạt động tốt . Tốt đẹp. –

7

Nếu bạn đang chạy SQL 2008, bạn có thể sử dụng chỉ mục được lọc theo đề xuất here.

create unique nonclustered index idx on dbo.DimCustomer(emailAddress) 
where EmailAddress is not null; 
Các vấn đề liên quan