2010-09-29 70 views

Trả lời

11

Cả hai được sử dụng để biểu thị candidate keys cho một bảng.

Bạn chỉ có thể có một khóa chính cho một bảng vì vậy chỉ cần chọn một khóa nếu bạn có nhiều ứng cử viên.

Hoặc có thể được sử dụng trong các ràng buộc khóa ngoại. Trong SQL Server, các cột Primary Key không thể rỗng. Các cột được sử dụng trong các ràng buộc khóa duy nhất có thể.

Theo mặc định trong SQL Server, khóa chính sẽ trở thành chỉ mục nhóm nếu được tạo trên heap nhưng không có nghĩa là bắt buộc chỉ mục PK và chỉ mục nhóm phải giống nhau.

+0

Bạn có ý nghĩa gì bởi "Theo mặc định trong SQL Server, khóa chính sẽ trở thành chỉ số nhóm nếu nó được tạo trên một đống"? –

+2

@ vgv8 - Vùng heap là bảng không có chỉ mục nhóm. Nếu bạn chạy 'ALTER TABLE dbo.tbl THÊM TÌM KIẾM PKNAME PRIMARY KEY (foo)' trên một đống, nó sẽ tạo ra một chỉ số nhóm với các khóa của chỉ mục là các cột PK. Nếu bảng đã có một chỉ số nhóm, nó sẽ tạo ra một chỉ mục duy nhất không được nhóm lại. –

+0

Ah, sẽ dễ hiểu hơn khi chỉ số nhóm có thể chỉ có một trên bảng và nếu không có chỉ mục nhóm khi PK được tạo thì PK được tạo thành nhóm (làm cho bảng được nhóm lại, không được xếp chồng), nếu không PK được CREATED không được nhóm lại. Cụm từ của bạn trong câu trả lời là mơ hồ vì chỉ mục, nhóm hoặc không được nhóm, luôn luôn (được tạo) trong cây B, đó là dữ liệu bảng thực tế có thể nằm trên vùng heap nếu dữ liệu này không được nhóm. Tôi có hiểu sai không? –

4

chìa khóa chính:

  1. Tiểu học trọng điểm là gì, nhưng nó xác định duy nhất mỗi hàng trong một bảng.

  2. Khóa chính không cho phép các giá trị trùng lặp, cũng không phải NULL.

  3. Khóa chính theo mặc định là chỉ mục được nhóm.

  4. Bảng chỉ có thể có một khóa chính.

Unique chính:

  1. chìa khóa duy nhất là không có gì nhưng nó xác định duy nhất mỗi hàng trong một bảng.

  2. Khóa duy nhất không cho phép giá trị trùng lặp, nhưng nó cho phép (nhiều nhất một) NULL.

  3. Khóa duy nhất theo mặc định là chỉ mục không được nhóm.

Đây là một đầy đủ liên kết trái để hiểu được Primary KeyDatabase Keys. Hãy nhớ chúng ta chỉ có một chỉ số nhóm trong một bảng [Nói về SQL Server 2005]. Bây giờ, nếu chúng tôi muốn thêm một cột duy nhất khác, chúng tôi sẽ sử dụng cột Khóa duy nhất, vì Cột khóa duy nhất có thể được thêm nhiều hơn một cột.

+5

Bạn có ý nghĩa gì bởi "không có gì"? –

7

Khóa chính là khóa được sử dụng để xác định hàng được đề cập. Nó cũng có thể có ý nghĩa nào đó (nếu đã có một phần dữ liệu "thực" có thể phục vụ) hoặc nó có thể hoàn toàn là một vật phẩm thực hiện (hầu hết các cột IDENTITY và các giá trị tăng tự động tương đương trên các hệ thống cơ sở dữ liệu khác).

Khóa duy nhất là trường hợp tổng quát hơn, trong đó khóa không thể có giá trị lặp lại. Trong hầu hết các trường hợp, mọi người không thể có cùng số an sinh xã hội liên quan đến cùng quyền tài phán (trường hợp quốc tế có thể khác nhau). Do đó nếu chúng ta lưu trữ số an sinh xã hội, thì chúng ta sẽ muốn mô hình hóa chúng là duy nhất, vì bất kỳ trường hợp nào của chúng khớp với một số hiện có rõ ràng là sai. Tên người dùng nói chung cũng phải là duy nhất, vì vậy đây là một trường hợp khác. Số nhận dạng bên ngoài (số nhận dạng được hệ thống, tiêu chuẩn hoặc giao thức khác sử dụng) cũng có xu hướng duy nhất, ví dụ: chỉ có một ngôn ngữ có mã ISO 639 nhất định, vì vậy nếu chúng tôi lưu trữ các mã ISO 639, chúng tôi sẽ mô hình hóa nó là duy nhất.

Tính duy nhất này cũng có thể nằm trên nhiều cột. Ví dụ, trong hầu hết các hệ thống phân loại thứ bậc (ví dụ cấu trúc thư mục), không có mục nào có cùng một mục cha và cùng tên, mặc dù có thể có các mục khác có cùng tên gốc và tên khác, và các mục khác có cùng tên và khác nhau cha mẹ. Khả năng đa cột này cũng xuất hiện trên các khóa chính.

Bảng cũng có thể có nhiều hơn một khóa duy nhất. Ví dụ. người dùng có thể có cả số id và tên người dùng và cả hai sẽ cần phải là duy nhất.

Do đó, bất kỳ khóa duy nhất không thể vô hiệu nào có thể đóng vai trò là khóa chính. Đôi khi các khóa chính đến từ dữ liệu bẩm sinh được mô hình hóa được gọi là "khóa chính tự nhiên", bởi vì chúng là một phần "tự nhiên" của dữ liệu, chứ không phải chỉ là một đồ tạo tác thực hiện. Quyết định sử dụng phụ thuộc vào một số điều sau:

  1. Khả năng thay đổi đặc điểm kỹ thuật. Nếu chúng tôi mô hình hóa số an sinh xã hội là duy nhất và sau đó phải thích ứng để cho phép nhiều khu vực pháp lý nơi hai hoặc nhiều hơn sử dụng hệ thống đánh số đủ tương tự để cho phép va chạm, chúng tôi có thể chỉ cần xóa ràng buộc duy nhất (các thay đổi khác có thể cần). Nếu đó là khóa chính của chúng tôi, bây giờ chúng tôi cũng cần phải sử dụng khóa chính mới và thay đổi bất kỳ bảng nào đang sử dụng khóa chính đó như một phần của mối quan hệ và bất kỳ truy vấn nào đã tham gia vào đó.

  2. Tốc độ tra cứu. Hiệu quả chính có thể quan trọng, vì chúng được sử dụng trong nhiều mệnh đề WHERE và (thường xuyên hơn) trong nhiều số JOIN s. Với đặc biệt là JOINS, tốc độ tra cứu có thể rất quan trọng. Tác động sẽ phụ thuộc vào chi tiết triển khai, và các cơ sở dữ liệu khác nhau tùy theo cách chúng xử lý các kiểu dữ liệu khác nhau (tôi sẽ có một vài vấn đề từ góc độ hiệu suất trong việc sử dụng một đoạn văn bản lớn làm khóa chính trong Postgres. hash tham gia, nhưng tôi sẽ rất do dự để làm như vậy trong SQLServer [Edit: cho "lớn" Tôi đang nghĩ đến có lẽ kích thước của một tên người dùng, không phải cái gì kích thước của toàn bộ Eddie Bắc Âu!]).

  3. Tần suất của khóa là dữ liệu thú vị duy nhất. Ví dụ, với một bảng các ngôn ngữ, và một bảng các mẩu chú thích trong ngôn ngữ đó, rất thường lý do duy nhất tôi muốn tham gia trên bảng ngôn ngữ khi giao dịch với bảng bình luận là lấy mã ngôn ngữ hoặc hạn chế một truy vấn cho những người có mã ngôn ngữ cụ thể. Các thông tin khác về ngôn ngữ có thể hiếm khi được sử dụng nhiều hơn. Trong trường hợp này, khi tham gia vào mã có khả năng kém hiệu quả hơn việc tham gia vào một số id được đặt từ cột IDENTITY, có mã là khóa chính - và do đó là mã được lưu trữ trong cột khóa ngoài trên bảng nhận xét - sẽ loại bỏ sự cần thiết cho bất kỳ JOIN ở tất cả, với một đạt được hiệu quả đáng kể. Thường xuyên hơn mặc dù tôi muốn biết thêm thông tin từ các bảng có liên quan hơn thế, vì vậy làm cho JOIN hiệu quả hơn là quan trọng hơn.

1

phiên bản ngắn:

  • Từ quan điểm của lý thuyết cơ sở dữ liệu, chẳng có ai. Cả hai chỉ đơn giản là các khóa ứng cử viên.
  • Trong thực tế, hầu hết DMBS muốn có một "khóa tiêu chuẩn", có thể được sử dụng cho ví dụ: quyết định cách lưu trữ dữ liệu, và để nói cho các công cụ và các máy khách DB là cách tốt nhất để xác định một bản ghi.

Vì vậy, việc phân biệt một khóa duy nhất là "khóa chính" chỉ là tiện ích triển khai (nhưng quan trọng).

+0

Không đúng sự thật, về lý thuyết cơ sở dữ liệu, một khóa duy nhất có thể có nhiều hơn giá trị null. Trong SQLServer cụ thể điều này không được phép (được coi là một lỗ hổng bởi nhiều), nhưng đó là SQLServer cụ thể, không phải là một điều db-lý thuyết. Bởi vì điều này, một khóa duy nhất là không đủ để xác định một hàng duy nhất như xa như lý thuyết db đi. –

+0

@Jon Hanna: Trong lý thuyết cơ sở dữ liệu, khóa ứng cử viên không thể chứa giá trị null. Thuật ngữ "khóa duy nhất" là một thuật ngữ và/hoặc một thuật ngữ sai. Tất cả các khóa là duy nhất và các khóa cũng không có giá trị, nhưng nếu chúng ta hiểu "duy nhất" theo nghĩa này để chỉ một ràng buộc unqiue * kiểu * * thì chúng ta đang nói về cái gì đó có thể chứa null và do đó không phải là "khóa" ở tất cả! Vì vậy, sleske là chính xác nếu "khóa duy nhất" được hiểu là "khóa ứng cử viên". Tôi khuyên bạn nên tránh thuật ngữ "khóa duy nhất" hoàn toàn. Nó quá mở để hiểu sai. – sqlvogel

+0

@dportas, không phải vì khóa không thể bao gồm một số hàng bằng null. –

3

Khóa chính chỉ là bất kỳ khóa ứng cử viên nào. Về nguyên tắc, các khóa chính không khác với bất kỳ khóa ứng cử viên nào khác bởi vì tất cả các khóa đều bằng nhau trong mô hình quan hệ.

Tuy nhiên, SQL có hai cú pháp khác nhau để triển khai các khóa ứng cử viên: ràng buộc CHÍNH PRIMARY và ràng buộc UNIQUE (trên các cột không có giá trị của khóa học). Trong thực tế, chúng đạt được chính xác điều tương tự ngoại trừ giới hạn vô dụng cơ bản là một khóa PRIMARY chỉ có thể được sử dụng một lần cho mỗi bảng trong khi một ràng buộc UNIQUE có thể được sử dụng nhiều lần.

Vì vậy, không có "sử dụng" cơ bản cho ràng buộc PRIMARY KEY. Nó là dự phòng và có thể dễ dàng bị bỏ qua hoặc bị loại bỏ hoàn toàn khỏi ngôn ngữ. Tuy nhiên, nhiều người thấy thuận tiện để chỉ ra một khóa cụ thể cho mỗi bảng có ý nghĩa đặc biệt. Có một quy ước rất được quan sát rộng rãi rằng các khóa được chỉ định với PRIMARY KEY được sử dụng cho các tham chiếu khóa ngoài, mặc dù điều này hoàn toàn là tùy chọn.

0

Cả khóa chính lẫn khóa duy nhất được sử dụng để thực thi, tính duy nhất của một cột. Vì vậy, khi nào bạn chọn cái khác?

Một bảng có thể có, chỉ một khóa chính. Nếu bạn muốn thực thi tính duy nhất trên 2 hoặc nhiều cột, thì chúng tôi sử dụng ràng buộc khóa duy nhất.

Sự khác biệt giữa Ràng buộc khóa chính và Ràng buộc khóa duy nhất?

1. Một bảng có thể chỉ có một khóa chính, nhưng nhiều hơn một khóa

2. Tiểu học trọng điểm độc đáo không cho phép null, nơi quan trọng như là duy nhất cho phép một rỗng

ALTER TABLE Table_Name 
ADD CONSTRAINT Constraint_Name PRIMARY KEY (Column_Name) 

Alter Table Table_Name 
Add Constraint Constraint_Name Unique(Column_Name) 
Các vấn đề liên quan