2009-08-20 43 views

Trả lời

20

Một khóa chính một lĩnh vực duy nhất trên một bảng nhưng nó là đặc biệt theo nghĩa là bàn cho rằng hàng như chính mình. Điều này có nghĩa là các bảng khác có thể sử dụng trường này để tạo mối quan hệ khóa ngoài với chính chúng.

Ràng buộc duy nhất đơn giản có nghĩa là một trường cụ thể phải là duy nhất.

+9

Khóa chính của một hàng là cách mà cơ sở dữ liệu nhận ra một hàng riêng lẻ. Nó có thể bao gồm một hoặc nhiều cột, mà cùng nhau cũng phải là duy nhất. – TheJacobTaylor

+11

Khóa chính là tập hợp các trường, không nhất thiết là một trường đơn lẻ. –

+11

Các ràng buộc duy nhất cũng có thể áp dụng cho các tổ hợp các trường. – chaos

4

Mỗi khóa chính là một ràng buộc duy nhất, nhưng ngoài PK, một bảng có thể có thêm các ràng buộc duy nhất.

Giả sử bạn có bảng Nhân viên, PK EmployeeID. Bạn có thể thêm một ràng buộc duy nhất trên SSN, ví dụ.

1

Khóa chính là tập hợp các cột tối thiểu sao cho bất kỳ hai bản ghi có giá trị giống hệt nhau trong các cột đó có giá trị giống nhau trong tất cả các cột. Lưu ý rằng khóa chính có thể bao gồm nhiều cột.

Ràng buộc duy nhất là chính xác những gì nó nghe như thế nào.

+1

@Từ ngữ của bạn khiến âm thanh như một ràng buộc duy nhất chỉ có thể áp dụng cho một cột duy nhất, điều này không đúng. – Kip

3

Ngoài câu trả lời của Andrew, bạn chỉ có thể có một khóa chính trên mỗi bảng nhưng bạn có thể có nhiều ràng buộc duy nhất.

+0

Bạn có thể có nhiều khóa chính, nó được gọi là khóa tổng hợp. – JMP

+10

Về mặt kỹ thuật, bạn có thể có khóa chính bao gồm nhiều trường, nhưng bạn vẫn có thể chỉ có một khóa chính tổng thể. – MattC

2
  1. Mục đích của khóa chính là xác định duy nhất một hàng trong bảng. Ràng buộc duy nhất đảm bảo rằng giá trị của một trường là duy nhất trong số các hàng trong bảng.
  2. Bạn chỉ có thể có một khóa chính cho mỗi bảng. Bạn có thể có nhiều hơn một ràng buộc duy nhất cho mỗi bảng.
48

Khóa chính không thể rỗng. Các phím duy nhất có thể.

+6

+1 Đây là sự khác biệt quan trọng. Nó có nghĩa là các cột trong khóa chính có thể giải quyết mọi hàng một cách rõ ràng, nhưng các cột duy nhất không thể (trừ khi chúng là ngẫu nhiên NOT NULL). –

+0

Đọc câu hỏi này (http://stackoverflow.com/questions/767657/how-do-i-create-unique-constraint-that-also-allows-nulls-in-sql-server) và câu trả lời, có vẻ như giống như hạn chế duy nhất không thể có null. Vì vậy, tôi bối rối. Đây có phải là MSSQL cụ thể hay không? –

0

Khóa chính không được rỗng nhưng ràng buộc duy nhất là không thể thực hiện được. khi bạn chọn khóa chính cho bảng của bạn, nó tự động lập chỉ mục trường đó.

0

Các khóa chính về cơ bản là sự kết hợp của (duy nhất + không null). cũng khi tham chiếu khóa ngoài, rdbms yêu cầu khóa chính.

Phím duy nhất chỉ áp đặt tính duy nhất của cột.Một giá trị của trường có thể là NULL trong trường hợp khóa uniqe. Ngoài ra, nó không thể được sử dụng để tham chiếu khóa ngoài, điều đó khá rõ ràng vì bạn có thể có giá trị null trong đó

+1

Không, khoá ngoại cũng có thể tham chiếu các cột trong một ràng buộc duy nhất. –

0

Hiện có một số câu trả lời hay ở đây. Ngoài thực tế là khóa chính không thể rỗng, là một ràng buộc duy nhất, và có thể bao gồm nhiều cột, có nghĩa sâu hơn phụ thuộc vào máy chủ cơ sở dữ liệu bạn đang sử dụng.

Tôi là người dùng SQL Server, vì vậy khóa chính có ý nghĩa cụ thể hơn đối với tôi. Trong SQL Server, theo mặc định, các khóa chính cũng là một phần của cái được gọi là "chỉ số nhóm". Một chỉ số nhóm xác định thứ tự thực tế của các trang dữ liệu cho bảng cụ thể đó, có nghĩa là thứ tự khóa chính khớp với thứ tự vật lý của các hàng trên đĩa.

Tôi biết rằng một, có thể nhiều hơn, các định dạng bảng của MySql cũng hỗ trợ lập chỉ mục nhóm, có nghĩa là giống như trong SQL Server ... nó xác định thứ tự hàng vật lý trên đĩa.

Oracle cung cấp thứ gọi là Bảng được tổ chức theo chỉ mục, thứ tự sắp xếp các hàng trên đĩa bằng khóa chính.

Tôi không quen thuộc với DB2, tuy nhiên tôi nghĩ rằng chỉ mục nhóm có nghĩa là các hàng trên đĩa được lưu trữ theo thứ tự giống như một chỉ mục riêng biệt. Tôi không biết liệu chỉ mục nhóm có phải khớp với khóa chính hay không hoặc đó có phải là chỉ mục riêng biệt hay không.

+0

Oracle có bảng chỉ mục được tổ chức, giống như chỉ mục nhóm SQL Server, ngoại trừ việc thứ tự nằm trên khóa chính, khi SQL Server có chỉ mục nhóm của nó trên một số chỉ mục khác. –

+0

@Shannon: Cảm ơn sự thấu hiểu. Tôi đã cập nhật câu trả lời của mình. – jrista

+0

@Shannon: Trong SQL Server, chỉ số nhóm IS là tập hợp các trang vật lý trên đĩa, giống như bảng Oracle Index-Organized. Không có chỉ mục riêng biệt cho chỉ mục nhóm ... tuy nhiên chỉ mục nhóm trong SQL Server không phải là chỉ mục khóa chính. Các bảng được tạo để nhóm trên khóa chính theo mặc định, nhưng không bị hạn chế để được nhóm theo khóa chính. – jrista

0

Cả hai đảm bảo tính duy nhất trên các hàng trong bảng, ngoại trừ các giá trị rỗng như được đề cập trong một số câu trả lời khác.

Ngoài ra, khóa chính "đi kèm", một chỉ mục có thể được nhóm hoặc không được nhóm.

+0

Nhiều RDBMS sẽ tự động tạo các chỉ mục cho các ràng buộc duy nhất. (Tôi không biết bất kỳ điều gì không.) –

12
  1. Khoá chính không được rỗng nhưng duy nhất chỉ có thể có một giá trị null.
  2. Khóa chính tạo chỉ mục cụm tự động nhưng không có khóa duy nhất.
  3. Bảng chỉ có thể có một khóa chính nhưng khóa duy nhất nhiều hơn một.
+1

+1 Câu trả lời hay. Lưu ý rằng điểm đầu tiên của bạn áp dụng cho SQL Server, nhưng không áp dụng cho MySQL, chẳng hạn. –

+0

Điểm đầu tiên của bạn không chính xác trong mọi trường hợp. –

+1

Điểm đầu tiên của bạn không đúng về tiêu chuẩn SQL và điểm thứ hai không liên quan đến tiêu chuẩn SQL (nhưng cả hai đều đúng với SQL Server). – onedaywhen

0

Một số lượng lớn câu trả lời ở đây đã thảo luận về các thuộc tính của PK so với các ràng buộc duy nhất. Nhưng điều quan trọng hơn là phải hiểu sự khác biệt về khái niệm.

Khóa chính được coi là số nhận dạng của bản ghi trong cơ sở dữ liệu. Vì vậy, những ví dụ này sẽ được tham chiếu khi tạo các tham chiếu khóa ngoài giữa các bảng. Do đó, khóa chính nên trong các trường hợp bình thường không bao giờ chứa các giá trị có bất kỳ sự sắp xếp nào trong miền của bạn (thường là các trường gia tăng tự động được sử dụng cho điều này).

Ràng buộc duy nhất chỉ là một cách để thực thi các quy tắc kinh doanh cụ thể theo tên miền trong lược đồ cơ sở dữ liệu của bạn.

Khi đặt PK là số nhận dạng cho bản ghi, bạn không bao giờ có thể thay đổi giá trị của khóa chính.

+2

+1 Bạn cũng nên xem xét khía cạnh này. Tuy nhiên câu cuối cùng của bạn không hoàn toàn đúng: 'Trở thành PK nó là mã định danh cho bản ghi, bạn không bao giờ có thể thay đổi giá trị của khóa chính.' Bạn có thể * không * thay đổi khóa chính, nhưng bạn * có thể * làm đi. –

+0

-1 "Vì vậy, một khóa chính nên trong các trường hợp bình thường không bao giờ chứa các giá trị có bất kỳ meaining trong miền của bạn" - một vấn đề của hương vị trình bày như là thực tế. – onedaywhen

4

trở ngại chính Unique:

  1. Unique ràng buộc khoá sẽ cung cấp cho bạn một hạn chế như các giá trị cột nên giữ lại tính độc đáo.
  2. Nó sẽ tạo chỉ mục không được nhóm theo mặc định
  3. Bất kỳ số lượng ràng buộc duy nhất nào có thể được thêm vào bảng.
  4. Nó sẽ cho phép giá trị null trong cột.

    ALTER TABLE tên_bảng ADD CONSTRAINT UNIQUE_CONSTRAINT UNIQUE (COLUMN_NAME1, COLUMN_NAME2, ...)

Primary Key:

  1. Tiểu học trọng điểm sẽ tạo ra cột dữ liệu độc đáo trong bảng .
  2. Tiểu học trọng điểm sẽ tạo chỉ mục clustered theo mặc định
  3. Chỉ có một chìa khóa primay thể được tạo ra cho một bảng
  4. Nhiều cột có thể được củng cố để tạo thành một đơn tiểu học then chốt
  5. Nó sẽ không cho phép giá trị null.

    ALTER TABLE tên_bảng ADD CONSTRAINT KEY_CONSTRAINT PRIMARY KEY (column_name)

+0

Điểm khóa chính 4: Ràng buộc 'UNIQUE' có thể là khóa đơn hoặc khóa phức (đơn giản = một cột, phức = nhiều cột) tức là không khác với' PRIMARY KEY' trong khía cạnh này. – onedaywhen

5

TL; DR Phần lớn có thể được ngụ ý bởi PRIMARY KEY (tính độc đáo, tài liệu tham khảo-thể, không null-Ness, clustering, vv) nhưng không thể nói rõ ràng bằng cách sử dụng UNIQUE.

Tôi đề nghị rằng nếu bạn là loại coder thích sự tiện lợi của SELECT * FROM... mà không cần phải liệt kê ra tất cả những cột pesky thì PRIMARY KEY chỉ là điều dành cho bạn.


một relvar có thể có nhiều khóa, nhưng chúng tôi chọn chỉ một cho gạch chân và gọi đó là một khóa chính. Sự lựa chọn là tùy ý, do đó, khái niệm của tiểu học không thực sự rất quan trọng từ một điểm logic của chế độ xem. Tuy nhiên, khái niệm chung về khóa là rất quan trọng! Khoá ứng cử viên có nghĩa chính xác giống như khóa (ví dụ, bổ sung của ứng cử viên không có ý nghĩa thực sự - nó được đề xuất bởi Ted Codd vì ông coi mỗi khóa là ứng cử viên được đề cử là khóa chính ) .. SQL cho phép một tập con của các cột trong bảng được khai báo là một khóa cho bảng đó. Nó cũng cho phép một trong số họ được được chỉ định làm khóa chính. Xác định một chìa khóa để được chính làm cho cho một số tiền nhất định của sự thuận tiện trong kết nối với trở ngại khác mà có thể là cần thiết

What Is a Key? by Hugh Darwen


đó là bình thường ... để chọn ra một chìa khóa làm khóa chính (và bất kỳ khóa nào khác của cho relvar được đề cập sau đó được gọi là các khóa thay thế). Nhưng cho dù một số khóa được chọn là chính, và nếu như vậy, một là, về cơ bản là các vấn đề tâm lý, ngoài tầm nhìn của mô hình quan hệ như vậy. Như một vấn đề của thực hành tốt, hầu hết các cơ sở relvars có lẽ nên có một khóa chính, nhưng, để lặp lại, quy tắc này, nếu nó là một quy tắc, thực sự không phải là một vấn đề quan hệ như vậy ... Mạnh mẽ khuyến nghị [để Người dùng SQL]: Đối với các bảng cơ sở, ở bất kỳ mức nào, sử dụng các thông số KEY CHÍNH và/hoặc UNIQUE để đảm bảo rằng mọi bảng như vậy đều có ít nhất một khóa.

SQL and Relational Theory: How to Write Accurate SQL Code By C. J. ngày

Trong SQL chuẩn PRIMARY KEY

  • ngụ ý độc đáo nhưng bạn có thể chỉ định một cách rõ ràng (sử dụng UNIQUE).
  • ngụ ý NOT NULL nhưng bạn có thể chỉ định một cách rõ ràng khi tạo cột (nhưng bạn nên tránh null dù sao đi nữa!)
  • cho phép bạn bỏ qua các cột của nó trong một FOREIGN KEY nhưng bạn có thể xác định chúng một cách rõ ràng.
  • có thể được khai báo chỉ cho một khóa trên mỗi bảng nhưng không rõ lý do tại sao (Codd, người đã đề xuất khái niệm ban đầu, không áp đặt hạn chế này).

Trong một số sản phẩm PRIMARY KEY ngụ ý nhóm chỉ số của bảng nhưng bạn có thể chỉ định một cách rõ ràng (có thể bạn không muốn khóa chính là clustered index!)

Đối với một số người PRIMARY KEY có ý nghĩa thuần túy tâm lý:

  • họ cho rằng khóa sẽ được tham chiếu bằng khóa ngoại (được Codd đề xuất nhưng không thực sự được các nhà cung cấp SQL và SQL chuẩn).
  • họ cho rằng nó biểu thị khóa duy nhất của bảng (nhưng việc không thực thi các khóa ứng cử viên khác dẫn đến mất toàn vẹn dữ liệu).
  • họ cho rằng nó ngụ ý khóa 'thay thế' hoặc 'nhân tạo' không có ý nghĩa đối với doanh nghiệp (nhưng thực sự áp đặt ý nghĩa không mong muốn trên doanh nghiệp bằng cách tiếp xúc với người dùng).
+0

bạn có thể có 1 giá trị NULL trong cột UNIQUE nếu không được xác định là NOT NULL, nhưng bạn có thể 'có bất kỳ NULLS trong cột CHÍNH CHÍNH/s –

1

Ràng buộc UNIQUE nhận dạng duy nhất từng bản ghi trong bảng cơ sở dữ liệu.

Ràng buộc KEY UNIQUE và PRIMARY cả hai đều đảm bảo tính duy nhất cho cột hoặc bộ cột.

Ràng buộc chính PRIMARY tự động có ràng buộc UNIQUE được xác định trên nó.

Lưu ý rằng bạn có thể có nhiều hạn chế UNIQUE mỗi bảng, nhưng chỉ có một hạn chế PRIMARY KEY mỗi bảng

0
create table a1 (id int,name varchar(20),city varchar(20),state varchar(20),country varchar(28) constraint pk_a1 primary key(id)); 
insert into a1 values(101,'sohan','gkp','up','india'); 


create table a1 (id int primary key,name varchar(20),city varchar(20),state varchar(20),country varchar(28)); 
insert into a1 values(101,'sohan','gkp','up','india'); 

diffrence giữa hai bảng này sử dụng khóa chính và sử dụng hạn chế

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