2012-02-08 41 views
5

Tôi có bảng sauUnique hàng hạn chế trong SQL Server

CREATE TABLE [dbo].[LogFiles_Warehouse](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [timestamp] [datetime] NOT NULL, 
    [clientNr] [int] NOT NULL, 
    [server] [nvarchar](150) COLLATE Latin1_General_CI_AS NOT NULL, 
    [storeNr] [int] NOT NULL, 
    [account] [nvarchar](50) COLLATE Latin1_General_CI_AS NOT NULL, 
    [software] [nvarchar](300) COLLATE Latin1_General_CI_AS NOT NULL, 
CONSTRAINT [PK_Astoria_LogFiles_Warehouse] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY] 

Và muốn tránh việc hàng trùng lặp trong bảng của tôi. Tôi nghĩ về việc tạo ra một chỉ số UNIQUE trên bảng đầy đủ, nhưng sau đó SQL Manager Studio nói với tôi rằng điều này là không thể bởi vì khóa sẽ là quá lớn.

Có cách nào khác để tôi có thể thực thi các hàng duy nhất trên tất cả các cột, ngoài các chỉ mục không?

+0

Bạn muốn hàng độc đáo trên cơ sở đó các cột? –

+2

Chắc chắn có một danh tính có nghĩa là sẽ không có hàng duy nhất, bạn đang nói về duy nhất trên phần còn lại của các cột –

+0

Bạn có thể cho chúng tôi biết sự quan tâm của một hạn chế như vậy là gì? Với các trường như dấu thời gian và clientNr, tôi nghi ngờ rằng bạn thậm chí có thể nhận được các hàng trùng lặp. –

Trả lời

8

Tạo một chỉ số UNIQUE trên các giá trị băm:

CREATE TABLE [dbo].[LogFiles_Warehouse] 
     (
     [id] [int] IDENTITY(1,1) NOT NULL, 
     [timestamp] [datetime] NOT NULL, 
     [clientNr] [int] NOT NULL, 
     [server] [nvarchar](150) COLLATE Latin1_General_CI_AS NOT NULL, 
     [storeNr] [int] NOT NULL, 
     [account] [nvarchar](50) COLLATE Latin1_General_CI_AS NOT NULL, 
     [software] [nvarchar](300) COLLATE Latin1_General_CI_AS NOT NULL, 
     serverHash AS CAST(HASHBYTES('MD4', server) AS BINARY(16)), 
     accountHash AS CAST(HASHBYTES('MD4', account) AS BINARY(16)), 
     softwareHash AS CAST(HASHBYTES('MD4', software) AS BINARY(16)) 
     ) 

CREATE UNIQUE INDEX 
     UX_LogFilesWarehouse_Server_Account_Software 
ON  LogFiles_Warehouse (serverHash, accountHash, softwareHash) 
+0

Sẽ không dễ dàng hơn khi băm hàng hoàn chỉnh và tạo chỉ mục trên băm đó? –

+0

@ Florian: dễ dàng hơn cho ai và làm cách nào để bạn "băm toàn bộ hàng"? Chỉ mục trên 3 trường 16 byte không phải là vấn đề đối với máy chủ. Và nếu bạn sẽ ghép tất cả các giá trị thì đó là một nguồn có thể gây nhầm lẫn giữa, ví dụ: 'server = MSSQLServer, account = 20081' và' server = MSSQLServer2008, account = 1'. – Quassnoi

+0

Được rồi, điều đó có ý nghĩa. Tôi có thể thêm các hàng khác vào chỉ mục không? (tức là dấu thời gian, khách hàng và storenr) Vì vậy, chỉ mục sẽ có hiệu quả trên tất cả các cột cuối cùng? Nếu không có IDENTITY tất nhiên. –

2

Sử dụng trình kích hoạt + chỉ mục không độc đáo nhỏ hơn so với các ion phân biệt nhất để trợ giúp giảm bớt các bảng có thể gây ra sự cố.

Điều này đi xuống rất nhiều vào một thiết kế cơ sở dữ liệu xấu để bắt đầu. Các trường như phần mềm, tài khoản không thuộc bảng đó để bắt đầu (hoặc nếu tài khoản, sau đó không phải là khách hàng nr). Bảng của bạn chỉ là khôn ngoan vì bạn arelady vi phạm cơ sở dữ liệu thiết kế cơ bản để bắt đầu với.

Ngoài ra, để loại bỏ các trường không duy nhất, bạn có NT để có trường Id trong thử nghiệm duy nhất nếu không bạn không bao giờ có gấp đôi để bắt đầu.

+1

Đây chỉ là một bảng để giữ các giá trị từ một logfile. __None__ của các trường có chức năng, transitive, multivalued hoặc bất kỳ phụ thuộc khác với nhau. Tất nhiên, điều đó có nghĩa là không bao giờ có hai hàng giống hệt nhau - nhưng, khi logfiles được nhập khẩu, người dùng có thể nhập cùng một tệp nhật ký hai lần và do đó tạo hai hàng giống hệt nhau. –

Các vấn đề liên quan