Có nên sử dụng Danh tính thay thế cho khóa chính không?


11

Chúng ta có thể khai báo một số Identitytương tự id_numđể id_numcó số gia tăng duy nhất.

CREATE TABLE new_employees
(
  id_num int IDENTITY(1,1),
  fname varchar (20),
  minit char(1),
  lname varchar(30)
)

Có nên sử dụng Identitythay thế cho Primary keyIdentityđã cung cấp một số duy nhất cho mỗi hàng không?


Tại sao bạn cần phải làm điều này? bởi vì thật tốt khi là một khóa chính trong bảng, nó sẽ tự động tạo chỉ mục cụm và tốt cho việc tối ưu hóa.
KuldipMCA

4
Không, nên sử dụng IDENTITY làm khóa chính (không thay thế cho PK). Nó tạo ra một khóa chính rất tốt, rất hiệu quả (theo mặc định cũng là khóa phân cụm trong SQL Server) - nó hẹp, thường là tĩnh, thường là duy nhất (trừ khi bạn tìm hiểu kỹ về thông số nhận dạng) và nó luôn luôn- tăng
marc_s

Câu trả lời:


23

Identity columnsPrimary Keyslà hai điều rất khác biệt. An Identity columncung cấp một số tăng tự động. Đó là tất cả những gì nó làm. Các Primary Key(ít nhất là trong SQL Server) là một hạn chế duy nhất đảm bảo tính độc đáo và thường là (nhưng không phải luôn luôn) phím cụm. Một lần nữa trong MS SQL Server, nó cũng là một chỉ mục (trong một số RDBMS, chúng không được liên kết chặt chẽ). Là một chỉ mục, nó cung cấp tra cứu nhanh hơn, v.v ... Thường Identity columnsđược sử dụng như là Primary Keykhông có gì tốt natural key, nhưng không phải là một thay thế.


1
Trong SQL Server, một chỉ mục không được nhóm chứa khóa chính ở cấp độ lá. Chỉ định một khóa tự nhiên làm khóa chính sẽ làm cho các chỉ mục của bạn rất lớn.
Andomar

2
@Andomar một PK là một thực thể logic. Chỉ số hỗ trợ cho PK là vật lý. Và một chỉ mục không bao gồm có thể hỗ trợ PK, không nhất thiết phải là một chỉ mục được nhóm. Do đó, tuyên bố của bạn không chính xác nếu chỉ số của PK là NCI. Đây là khóa chỉ mục được nhóm ở cấp độ lá của NCI.
Thomas Stringer

@ThomasStringer: Bạn nói đúng, bình luận của tôi nên đọc clustered index keyở đâu primary key.
Andomar

Có khả năng. Khóa tự nhiên của bạn có thể là một số nguyên trong trường hợp không có sự khác biệt. Số lượng đối số bạn sẽ thấy trên các phím Nhân tạo và Tự nhiên rất đáng kinh ngạc. Thỉnh thoảng hãy thử tìm kiếm trên web :) Điều đó chỉ là một trong những đối số cho các khóa nhân tạo.
Kenneth Fisher

5

Không, không, vì danh tính không đảm bảo một giá trị duy nhất. Thuộc tính danh tính có thể được bỏ qua SET IDENTITY_INSERT <schema>.<table> ON(trong SQL Server - bạn không chỉ định RDBMS nào bạn đang sử dụng).

Một ràng buộc khóa chính (và một ràng buộc duy nhất) sử dụng một chỉ mục duy nhất để thực thi tính duy nhất.


5
nó không đảm bảo một giá trị duy nhất. Nhưng không làm gì khác. Bất cứ ai có quyền truy cập vào cơ sở dữ liệu đều có thể cố gắng CHỌN các giá trị trùng lặp vào khóa chính. Những gì một bản sắc làm là giúp dễ dàng tạo ra các giá trị duy nhất (đặc biệt là nếu bạn không có khóa tự nhiên tốt như Kenneth Fisher nói). Bạn có thể khai báo một trường số nguyên với khóa chính và nó sẽ hoàn toàn giống như vậy nhưng không có tự động tạo. Vì vậy, IDENTITY dành cho thế hệ và chìa khóa là để thực thi tính duy nhất.
Chris Aldrich

+1 Để chỉ ra lỗ hổng cơ bản trong tiền đề của câu hỏi - IdentityPrimary Keykhông tương đương và phục vụ hai mục đích riêng biệt.
JNK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.