Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Sự khác biệt giữa khóa chính và 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 là gì?”

Đây có lẽ là câu hỏi phỏng vấn xin việc thường gặp nhất đối với các nhà phát triển cơ sở dữ liệu. Trong bài viết này, chúng tôi sẽ cố gắng giải đáp.

Hãy bắt đầu bằng cách xem khóa chính và khóa duy nhất là gì, cũng như điểm tương đồng của chúng.

Khóa chính

Một khóa chính được sử dụng để xác định duy nhất từng bản ghi trong bảng. Mỗi bảng phải có ít nhất một khóa chính. Để xác định khóa chính trong máy chủ SQL, bạn chỉ cần sử dụng các từ khóa 'Khóa chính' sau tên của cột.

Khóa duy nhất

Một cột có ràng buộc khóa duy nhất chỉ có thể chứa các giá trị duy nhất - đây là kết quả của việc khóa duy nhất cấm các giá trị trùng lặp được lưu trữ bên trong một cột.

Để xác định khóa duy nhất, bạn phải thêm 'Unique' vào tên của trường. Xin lưu ý rằng không bắt buộc phải có Khóa duy nhất trong bảng.

Ví dụ về tạo các khóa chính và duy nhất

Tập lệnh sau tạo cơ sở dữ liệu 'Kiểm tra' chứa một bảng có tên là 'Ô tô'.

Bảng này sẽ có một cột khóa chính có tên là "ID" và một cột khóa duy nhất có tên là "NumberPlate".

CREATE DATABASE TEST
GO
USE TEST
GO


CREATE TABLE Cars (
    ID int PRIMARY KEY,
    Name varchar(255) NOT NULL,
    NumberPlate varchar(255) UNIQUE,
    Model int
);

Tiếp theo, hãy thêm một vài bản ghi giả vào bảng "Ô tô" của chúng ta. Thực thi tập lệnh sau:

INSERT INTO Cars
VALUES 
(1, 'Toyota', 'ABC 123', 199),
(2, 'Toyota', 'ABC 345', 207),
(3, 'Toyota', 'ABC 758', 205),
(4, 'Toyota', 'ABC 741', 306),
(5, 'Toyota', 'ABC 356', 124)

Trước khi chúng ta nói về sự khác biệt, trước tiên chúng ta hãy xem xét điểm tương đồng giữa khóa chính và khóa duy nhất.

Điểm giống nhau giữa Khóa chính và Khóa duy nhất

  1. Các cột có khóa chính hoặc khóa duy nhất không được có giá trị trùng lặp.

Hãy thử thêm bản ghi mới có giá trị ID là 2 (đã tồn tại) vào bảng "Ô tô". Thực thi tập lệnh sau:

INSERT INTO Cars
VALUES 
(2, 'Toyota', 'ABC 345', 356)

Khi bạn thực thi tập lệnh ở trên, lỗi sau sẽ được hiển thị:

Lỗi rõ ràng nói rằng câu lệnh này vi phạm ràng buộc khóa chính và không thể chèn các giá trị trùng lặp vào cột khóa chính.

Tương tự, hãy thử chèn một giá trị trùng lặp vào cột ‘NumberPlate’ với một ràng buộc khóa duy nhất bằng cách sử dụng truy vấn sau:

INSERT INTO Cars
VALUES 
(6, 'Toyota', 'ABC 345', 356)

Lần này, bạn sẽ thấy rằng có sự vi phạm giới hạn khóa duy nhất vì giá trị ‘ABC 345’ đã tồn tại trong cột ‘NumberPlate’ có giới hạn khóa duy nhất. Thông báo lỗi sẽ giống như sau:

  1. Vì cả khóa chính và cột duy nhất không chấp nhận các giá trị trùng lặp, chúng có thể được sử dụng để xác định duy nhất một bản ghi trong bảng. Điều này có nghĩa là đối với mỗi giá trị trong cột khóa chính hoặc duy nhất, chỉ một bản ghi sẽ được trả về.

Sự khác biệt giữa Khóa chính và Khóa duy nhất

Giờ chúng ta đã hiểu điểm tương đồng giữa khóa chính và khóa duy nhất, hãy cùng xem xét sự khác biệt của chúng.

  1. Một bảng chỉ có thể có một khóa chính nhưng có nhiều khóa duy nhất.

Ví dụ sau sẽ giúp chúng ta hiểu rõ hơn về điều này.

Bên trong cơ sở dữ liệu "Kiểm tra" mà chúng tôi đã thực hiện trước đó, hãy tạo một bảng "Cars2" mới với hai khóa chính. Để thực hiện việc này, hãy thực thi tập lệnh sau:

CREATE TABLE Cars2 (
    ID int PRIMARY KEY,
    Name varchar(255) NOT NULL,
    NumberPlate varchar(255) UNIQUE,
    Model int PRIMARY KEY
);

Trong đoạn mã ở trên, chúng tôi đặt các ràng buộc khóa chính trên cột ID và Model. Tuy nhiên, vì chỉ một cột trong bảng có thể có ràng buộc khóa chính, bạn sẽ thấy lỗi sau:

Thông báo lỗi này cho chúng tôi biết rõ ràng rằng một bảng không thể có nhiều ràng buộc khóa chính.

Bây giờ, hãy thêm nhiều ràng buộc khóa duy nhất vào bảng "Cars2". Hãy xem tập lệnh sau:

CREATE TABLE Cars2 (
    ID int PRIMARY KEY,
    Name varchar(255) NOT NULL,
    NumberPlate varchar(255) UNIQUE,
    Model int UNIQUE
);

Điều này cho phép chúng tôi thêm các ràng buộc khóa duy nhất trên cột ‘NumberPlate’ và ‘Model’. Vì một bảng có thể có nhiều cột với các ràng buộc khóa duy nhất, bạn sẽ không thấy bất kỳ thông báo lỗi nào khi thực thi tập lệnh trên.

  1. Cột khóa chính không được có giá trị rỗng trong khi cột Khóa duy nhất có thể có một giá trị rỗng.

Hãy xem điều này trong hành động. Trước tiên, hãy thêm bản ghi có giá trị null vào cột khóa chính trong bảng "Ô tô". Xem kịch bản bên dưới:

INSERT INTO Cars
VALUES 
( null, 'Toyota', 'ABC 345', 356)

Bạn có thể thấy rằng tập lệnh này chèn giá trị null vào cột ID. Khi bạn thực thi nó, bạn sẽ thấy lỗi sau trong cửa sổ thông báo đầu ra:

Lỗi cho chúng tôi biết rằng không thể chèn giá trị null vì cột khóa chính không cho phép giá trị null.

Bây giờ chúng ta hãy thử thêm giá trị null vào cột khóa duy nhất 'NumberPlate'. Để thực hiện việc này, hãy thực thi tập lệnh sau:

INSERT INTO Cars
VALUES 
( 6, 'Toyota',null, 356)

Thao tác này thêm một bản ghi mới với giá trị ID là 6 và giá trị null vào bảng ‘Cars’ - cụ thể, giá trị null được gán cho cột ‘NumberPlate’. Bạn sẽ thấy rằng tập lệnh trên sẽ được thực thi mà không có lỗi vì cột khóa duy nhất có thể chấp nhận giá trị null theo mặc định.

Để xác minh xem giá trị null đã thực sự được chèn vào cột ‘NumberPlate’ hay chưa, chúng tôi sẽ cần chọn tất cả các bản ghi từ bảng ‘Cars’ bằng cách sử dụng tập lệnh sau:

SELECT * FROM Cars


Trong tập kết quả ở trên, chúng ta có thể thấy rõ rằng cột khóa chính 'ID' không 'không chứa bất kỳ giá trị rỗng nào. Mặt khác, cột ‘NumberPlate’ với ràng buộc khóa duy nhất không chứa giá trị null mà chúng tôi vừa chèn. Hãy nhớ rằng bạn không thể thêm nhiều hơn một giá trị null vào một cột khóa duy nhất vì giá trị null thứ hai sẽ là bản sao của giá trị đầu tiên - và không được phép trùng lặp.

  1. Theo mặc định, chỉ mục nhóm duy nhất được tạo trên cột khóa chính; mặt khác, một chỉ mục không phân cụm duy nhất được tạo trên cột khóa duy nhất.

Để xem các chỉ mục trên bảng 'Ô tô', hãy thực thi tập lệnh sau:

USE TEST
GO
sp_help Cars

Trong đầu ra, bạn sẽ thấy chi tiết của bảng 'Cars' bao gồm các chỉ số như trong hình bên dưới:

Từ hình trên, bạn có thể thấy rằng cột 'NumberPlate' có chỉ mục duy nhất không được phân nhóm trong khi cột ID có chỉ mục duy nhất được phân nhóm.

Kết luận

Mặc dù có một vài điểm tương đồng cơ bản, nhưng khóa chính và khóa duy nhất có những khác biệt đáng kể. Bạn chỉ có thể có một khóa chính cho mỗi bảng, nhưng có nhiều khóa duy nhất. Tương tự, cột khóa chính không chấp nhận giá trị null, trong khi các cột khóa duy nhất có thể chứa một giá trị null mỗi cột. Và cuối cùng, cột khóa chính có chỉ mục được phân nhóm duy nhất trong khi cột khóa duy nhất có chỉ mục không được phân cụm duy nhất.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. XEM TRƯỚC:Tiện ích mở rộng SentryOne Plan Explorer dành cho Azure Data Studio

  2. Cách các kế hoạch song song bắt đầu - Phần 2

  3. Kết nối với Sage từ Java

  4. Định cấu hình kết nối Nhóm khả dụng

  5. Lịch sử lệnh trong isql