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

Khóa chính trong SQL Server

Trên tất cả các sản phẩm RDBMS chính, Khóa chính trong ràng buộc SQL có vai trò sống còn. Họ xác định các bản ghi có trong một bảng duy nhất. Do đó, chúng ta nên chọn máy chủ Khóa chính cẩn thận trong quá trình thiết kế bảng để cải thiện hiệu suất.

Trong bài viết này, chúng ta sẽ tìm hiểu ràng buộc Khóa chính là gì. Ngoài ra, chúng ta sẽ xem cách tạo, sửa đổi hoặc loại bỏ các ràng buộc của Khóa chính.

Các ràng buộc của SQL Server

Trong SQL Server, Ràng buộc là các quy tắc quy định việc nhập dữ liệu vào các cột cần thiết. Các ràng buộc thực thi tính chính xác của dữ liệu và cách dữ liệu đó khớp với các yêu cầu kinh doanh. Ngoài ra, chúng làm cho dữ liệu trở nên đáng tin cậy đối với người dùng cuối. Đó là lý do tại sao điều quan trọng là xác định các Ràng buộc chính xác trong giai đoạn thiết kế của cơ sở dữ liệu hoặc lược đồ bảng.

SQL Server hỗ trợ Loại ràng buộc sau để thực thi tính toàn vẹn của dữ liệu:

Các ràng buộc về khóa chính được tạo trên một cột duy nhất hoặc kết hợp các cột để thực thi tính duy nhất của bản ghi và xác định bản ghi nhanh hơn. Các cột liên quan không được chứa giá trị NULL. Do đó, thuộc tính NOT NULL phải được xác định trên các cột.

Các ràng buộc đối với khóa ngoại được tạo trên một cột duy nhất hoặc kết hợp các cột để tạo mối quan hệ giữa hai bảng và thực thi dữ liệu có trong bảng này sang bảng khác. Tốt nhất, các cột trong bảng mà chúng ta cần thực thi dữ liệu với ràng buộc Khoá ngoại tham chiếu đến bảng Nguồn có khoá chính trong SQL hoặc ràng buộc Khoá duy nhất. Nói cách khác, chỉ những bản ghi có sẵn trong ràng buộc Khóa chính hoặc Khóa duy nhất của bảng Nguồn mới có thể được chèn hoặc cập nhật vào bảng Đích.

Ràng buộc chính duy nhất được tạo trên một cột hoặc kết hợp các cột để thực thi tính duy nhất trên toàn bộ dữ liệu cột. Chúng tương tự như các ràng buộc Khóa chính với một thay đổi duy nhất. Sự khác biệt giữa Ràng buộc khóa chính và Khóa duy nhất là Ràng buộc khóa sau có thể được tạo trên Không thể hủy bỏ và cho phép một bản ghi giá trị NULL trong cột của nó.

Kiểm tra các ràng buộc được tạo trên một cột duy nhất hoặc kết hợp các cột bằng cách hạn chế các giá trị dữ liệu được chấp nhận cho các cột liên quan thông qua một biểu thức logic. Có sự khác biệt giữa Khoá ngoại và Ràng buộc Kiểm tra. Khóa ngoài thực thi tính toàn vẹn của dữ liệu bằng cách kiểm tra dữ liệu từ Khóa chính hoặc Khóa duy nhất của bảng khác. Tuy nhiên, Ràng buộc Kiểm tra thực hiện điều này bằng cách sử dụng một biểu thức logic.

Bây giờ, hãy xem qua các Ràng buộc chính của khóa chính.

Ràng buộc Khóa Chính

Ràng buộc khóa chính thực thi tính duy nhất trên một cột hoặc kết hợp các cột mà không có bất kỳ giá trị NULL nào bên trong các cột liên quan.

Để thực thi tính duy nhất, SQL Server tạo một chỉ mục nhóm duy nhất trên các cột nơi các Khóa chính được tạo ra. Nếu có bất kỳ chỉ mục nhóm nào hiện có, SQL Server sẽ tạo một chỉ mục Không phân nhóm duy nhất trên bảng cho Khóa chính.

Hãy xem cách chúng tôi tạo, sửa đổi, thả, vô hiệu hóa hoặc bật khóa chính trên bảng bằng cách sử dụng tập lệnh T-SQL.

Tạo khóa chính

Chúng ta có thể tạo các khóa chính trên bảng trong khi tạo bảng hoặc sau đó. Cú pháp hơi khác nhau đối với những trường hợp này.

Tạo khóa chính trong quá trình tạo bảng

Cú pháp như sau:

CREATE TABLE SCHEMA_NAME.TABLE_NAME
( 
  COLUMN1 datatype [ NULL | NOT NULL ] PRIMARY KEY,
  COLUMN2 datatype [ NULL | NOT NULL ],
  ...
);

Hãy tạo một bảng có tên Nhân viên trong Nguồn nhân lực giản đồ cho mục đích thử nghiệm với tập lệnh dưới đây:

CREATE TABLE HumanResources.Employees
( Employee_Id INT IDENTITY NOT NULL PRIMARY KEY,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money
);

Chúng tôi đã tạo thành công HumanResources.E Employees trên AdventureWorks cơ sở dữ liệu:

Chúng ta có thể thấy rằng chỉ mục nhóm đã được tạo trên bảng khớp với tên Khóa chính như được đánh dấu ở trên.

Hãy thả bảng bằng cách sử dụng tập lệnh bên dưới và thử lại với cú pháp mới.

DROP TABLE HumanResources.Employees

Để tạo Khóa chính trong SQL trên bảng có tên Khóa chính do người dùng xác định PK_E Employees , sử dụng cú pháp dưới đây:

CREATE TABLE HumanResources.Employees
( Employee_Id INT IDENTITY NOT NULL,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money,
  CONSTRAINT PK_Employees PRIMARY KEY (Employee_Id)
);

Chúng tôi đã tạo HumanResources.E Employees bảng có tên Khóa chính PK_E Employees :

Tạo khóa chính sau khi tạo bảng

Đôi khi, các nhà phát triển hoặc DBA quên các Khóa chính và tạo bảng mà không có các khóa đó. Nhưng có thể tạo khóa chính trên các bảng hiện có.

Hãy loại bỏ HumanResources.E Employees và tạo lại nó bằng cách sử dụng tập lệnh dưới đây:

DROP TABLE HumanResources.Employees
GO
CREATE TABLE HumanResources.Employees
( Employee_Id INT IDENTITY NOT NULL,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money
);
GO

Khi bạn thực thi tập lệnh này thành công, chúng tôi có thể thấy HumanResources.E Employees bảng được tạo mà không có bất kỳ khóa hoặc chỉ mục chính nào:

Để tạo một Khóa chính có tên PK_E Employees trên bảng này, hãy sử dụng cú pháp dưới đây:

ALTER TABLE <schema_name>.<table_name>
ADD CONSTRAINT <constraint_name> PRIMARY KEY ( <column_name> );

Việc thực thi tập lệnh này sẽ tạo ra Khóa chính trên bảng của chúng tôi:

ALTER TABLE HumanResources.Employees
ADD CONSTRAINT PK_Employees PRIMARY KEY (Employee_ID);

Tạo khóa chính trên nhiều cột

Trong các ví dụ của chúng tôi, chúng tôi đã tạo Khóa chính trên các cột đơn. Nếu chúng ta muốn tạo các khóa chính trên nhiều cột, chúng ta cần một cú pháp khác.

Để thêm nhiều cột như một phần của Khóa chính, chúng tôi chỉ cần thêm các giá trị được phân tách bằng dấu phẩy của tên cột sẽ là một phần của Khóa chính.

Khóa chính trong quá trình tạo bảng

CREATE TABLE HumanResources.Employees
( First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money,
  CONSTRAINT PK_Employees PRIMARY KEY (First_Name, Last_Name)
);
GO

Khóa chính sau khi tạo bảng

CREATE TABLE HumanResources.Employees
( First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money
);
GO
ALTER TABLE HumanResources.Employees
ADD CONSTRAINT PK_Employees PRIMARY KEY (First_Name, Last_Name);
GO

Bỏ khóa chính

Để Bỏ Khóa Chính, chúng tôi sử dụng cú pháp dưới đây. Không quan trọng nếu Khóa chính nằm trên một cột hay nhiều cột.

ALTER TABLE <schema_name>.<table_name>
DROP CONSTRAINT <constraint_name> ;

Để bỏ Ràng buộc khóa chính trên HumanResources.E Employees bảng, sử dụng tập lệnh dưới đây:

ALTER TABLE HumanResources.Employees
DROP CONSTRAINT PK_Employees;

Việc đánh rơi Khóa chính sẽ xóa cả Khóa chính và chỉ mục được nhóm hoặc không theo nhóm được tạo cùng với việc tạo khóa chính:

Sửa đổi Khóa chính

Trong SQL Server, không có lệnh trực tiếp nào để sửa đổi các khóa chính. Chúng tôi cần Bỏ một Khóa chính hiện có và tạo lại nó với các sửa đổi cần thiết. Do đó, các bước để sửa đổi Khóa chính là:

  1. Bỏ một Khóa chính hiện có.
  2. Tạo các Khóa chính mới với những thay đổi cần thiết.

Tắt / Bật Khóa chính

Trong khi thực hiện tải hàng loạt trên bảng có nhiều bản ghi, hãy tắt Khóa chính và bật lại để có hiệu suất tốt hơn. Các bước sau:

Vô hiệu hóa Khóa chính hiện có bằng cú pháp sau:

ALTER INDEX <index_name> ON <schema_name>.<table_name> DISABLE;

Để vô hiệu hóa Khóa chính trên HumanResources.E Employees bảng, tập lệnh là:

ALTER INDEX PK_Employees ON HumanResources.Employees
DISABLE;

Bật các Khóa chính hiện có ở trạng thái tắt. Chúng ta cần XÂY DỰNG lại chỉ mục bằng cú pháp sau:

ALTER INDEX <index_name> ON <schema_name>.<table_name> REBUILD;

Để bật Khóa chính trên HumanResources.E Employees bảng, sử dụng tập lệnh sau:

ALTER INDEX PK_Employees ON HumanResources.Employees
REBUILD;

Những lầm tưởng về Khóa chính

Rất nhiều người nhầm lẫn về những lầm tưởng dưới đây liên quan đến Khóa chính trong SQL Server.

  • Bảng có Khóa chính không phải là Bảng Heap
  • Các Khóa chính có Chỉ mục được phân nhóm và dữ liệu được sắp xếp theo Thứ tự Vật lý

Hãy làm rõ chúng.

Bảng có Khóa chính không phải là Bảng Heap

Trước khi tìm hiểu sâu hơn, chúng ta hãy sửa đổi định nghĩa của Khóa chính và Bảng đống.

Khóa chính tạo Chỉ mục được nhóm trên một bảng nếu không có chỉ mục được nhóm nào khác có sẵn ở đó. Bảng không có Chỉ mục được phân cụm sẽ là Bảng đống.

Dựa trên các định nghĩa này, chúng ta có thể hiểu rằng Khóa chính chỉ tạo Chỉ mục được phân cụm nếu không có Chỉ mục được phân cụm nào khác trên bảng. Nếu có bất kỳ chỉ mục được nhóm nào hiện có, việc tạo Khóa chính sẽ tạo chỉ mục Không được phân cụm trên bảng phù hợp với Khóa chính.

Hãy xác minh điều này bằng cách loại bỏ HumanResources.E Employees Lập bảng và tạo lại nó:

DROP TABLE HumanResources.Employees
GO
CREATE TABLE HumanResources.Employees
( Employee_Id INT IDENTITY NOT NULL,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money,
  CONSTRAINT PK_Employees PRIMARY KEY NONCLUSTERED (Employee_Id)
);
GO

Chúng tôi có thể chỉ định tùy chọn chỉ mục KHÔNG ĐƯỢC ĐIỀU CHỈNH cho Khóa chính (xem ở trên). Một bảng đã được tạo bằng chỉ mục Duy nhất, không theo nhóm cho PK_ Nhân viên chính của nhóm chính .

Do đó, bảng này là một Bảng Heap mặc dù nó có một Khóa chính.

Hãy xem liệu SQL Server có thể tạo chỉ mục không phân cụm cho Khóa chính hay không nếu chúng tôi không chỉ định từ khóa Không phân cụm trong quá trình tạo khóa chính. Sử dụng tập lệnh dưới đây:

DROP TABLE HumanResources.Employees
GO
CREATE TABLE HumanResources.Employees
( Employee_Id INT IDENTITY NOT NULL,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL,
  DOB DATETIME,
  Dept varchar(100),
  Salary Money
);
GO

-- Create Clustered Index on Employee_Id column before creating Primary Key
CREATE CLUSTERED INDEX IX_Employee_ID ON HumanResources.Employees(First_Name, Last_Name);
GO

-- Create Primary Key on Employee_Id column
ALTER TABLE HumanResources.Employees
ADD CONSTRAINT PK_Employees PRIMARY KEY (Employee_ID);
GO

Ở đây chúng tôi đã tạo một chỉ mục được nhóm riêng trước khi tạo Khóa chính. Và một bảng chỉ có thể có một chỉ mục được phân nhóm. Do đó, SQL Server đã tạo Khóa chính dưới dạng chỉ mục Duy nhất, Không phân cụm. Hiện tại, bảng không phải là một bảng Heap vì nó có một chỉ mục được phân nhóm.

Nếu tôi đổi ý và bỏ chỉ mục được nhóm lại trên First_Name Last_Name sử dụng tập lệnh bên dưới:

DROP INDEX IX_Employee_ID ON HumanResources.Employees;
GO

Chúng tôi đã loại bỏ chỉ mục nhóm thành công. Nguồn nhân lực. Người lao động bảng là một bảng Heap mặc dù chúng ta có sẵn một Khóa chính trong bảng:

Điều này xóa bỏ lầm tưởng rằng một bảng có Khóa chính có thể là một bảng Heap nếu không có chỉ mục nhóm nào có sẵn trên bảng.

Khóa chính sẽ có Chỉ mục được nhóm và Dữ liệu được sắp xếp theo Thứ tự Vật lý

Như chúng ta đã học từ ví dụ trước, một khóa chính trong SQL có thể có một chỉ mục không phân cụm. Trong trường hợp đó, các bản ghi sẽ không được sắp xếp theo thứ tự Thực tế.

Hãy xác minh bảng với chỉ mục được nhóm trên một khóa Chính. Chúng tôi sẽ kiểm tra xem nó có sắp xếp các bản ghi theo thứ tự Thực tế hay không.

Tạo lại HumanResources.E Employees bảng với các cột tối thiểu và thuộc tính IDENTITY đã bị xóa cho Employee_ID cột:

DROP TABLE HumanResources.Employees
GO
CREATE TABLE HumanResources.Employees
( Employee_Id INT NOT NULL,
  First_Name VARCHAR(100) NOT NULL,
  Last_Name VARCHAR(100) NOT NULL
);
GO

Bây giờ chúng tôi đã tạo bảng mà không có Khóa chính hoặc chỉ mục theo nhóm, chúng tôi có thể CHÈN 3 bản ghi theo thứ tự không được sắp xếp cho Employee_Id cột:

INSERT INTO HumanResources.Employees ( Employee_Id, First_Name, Last_Name)
VALUES
(3, 'Antony', 'Mark'),
(1, 'James', 'Cameroon'),
(2, 'Jackie', 'Chan')

Hãy chọn từ Nguồn nhân lực. Nhân viên bảng:

SELECT * 
FROM HumanResources.Employees

Chúng ta có thể thấy các bản ghi được tìm nạp theo thứ tự giống như các bản ghi được chèn từ bảng Heap tại thời điểm này.

Hãy tạo một Khóa chính trên bảng Heap này và xem liệu nó có bất kỳ tác động nào đến câu lệnh SELECT hay không:

ALTER TABLE HumanResources.Employees
ADD CONSTRAINT PK_Employees PRIMARY KEY (Employee_ID);
GO
SELECT * 
FROM HumanResources.Employees

Sau khi tạo Khóa chính, chúng ta có thể thấy rằng câu lệnh SELECT đã tìm nạp các bản ghi theo thứ tự Tăng dần của Employee_Id (Cột Khóa chính). Đó là do chỉ mục được nhóm lại trên Employee_Id .

Nếu Khóa chính được tạo bằng tùy chọn không phân nhóm, dữ liệu bảng sẽ không được sắp xếp dựa trên cột Khóa chính.

Nếu độ dài của một bản ghi trong bảng vượt quá 4030 byte, thì chỉ một bản ghi có thể vừa với một trang. Chỉ mục được phân nhóm đảm bảo rằng các trang theo thứ tự Thực tế.

Trang là đơn vị lưu trữ cơ bản trong tệp dữ liệu SQL Server có kích thước 8 KB (8192 byte). Chỉ 8060 byte của đơn vị đó có thể sử dụng để lưu trữ dữ liệu. Số tiền còn lại dành cho tiêu đề trang và các phần bên trong khác.

Mẹo để Chọn các Cột Khoá Chính

  • Các cột kiểu dữ liệu số nguyên phù hợp nhất với Cột khóa chính vì chúng chiếm kích thước bộ nhớ nhỏ hơn và có thể giúp truy xuất dữ liệu nhanh hơn.
  • Vì các Cột Khóa Chính có chỉ mục nhóm theo mặc định, hãy sử dụng tùy chọn IDENTITY trên các cột kiểu dữ liệu số nguyên để tạo các giá trị mới theo thứ tự tăng dần.
  • Thay vì tạo Khóa chính trên Nhiều cột, hãy tạo một cột số nguyên mới với thuộc tính IDENTITY được xác định. Ngoài ra, hãy tạo một chỉ mục duy nhất trên nhiều cột đã được xác định ban đầu để có hiệu suất tốt hơn.
  • Cố gắng tránh các cột có kiểu dữ liệu chuỗi như varchar, nvarchar, v.v. Chúng tôi không thể đảm bảo sự gia tăng tuần tự của dữ liệu trên các kiểu dữ liệu này. Nó có thể ảnh hưởng đến hiệu suất INSERT trên các cột này.
  • Chọn các cột mà các giá trị sẽ không được cập nhật làm Khóa chính. Ví dụ:nếu giá trị Khóa chính có thể thay đổi từ 5 thành 1000, cây B liên kết với chỉ mục được phân nhóm cần được cập nhật, dẫn đến hiệu suất giảm nhẹ.
  • Nếu các cột kiểu dữ liệu chuỗi cần được chọn làm cột Khóa chính, hãy đảm bảo rằng độ dài của cột kiểu dữ liệu varchar hoặc nvarchar vẫn nhỏ để có hiệu suất tốt hơn.

Kết luận

Chúng ta đã xem qua những điều cơ bản về các Ràng buộc có sẵn trong SQL Server. Chúng tôi đã kiểm tra chi tiết các ràng buộc của Khóa chính và tìm hiểu cách tạo, thả, sửa đổi, vô hiệu hóa và xây dựng lại Khóa chính. Ngoài ra, chúng tôi đã làm rõ một số lầm tưởng phổ biến xung quanh Khóa chính bằng các ví dụ.

Hãy theo dõi các bài viết tiếp theo!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tốt nhất để kiểm soát phiên bản các thủ tục được lưu trữ trên máy chủ SQL của tôi là gì?

  2. Cách lấy danh sách các Bảng không có Ràng buộc khóa chính trong tất cả Cơ sở dữ liệu của Phiên bản SQL Server - Hướng dẫn SQL Server / TSQL Phần 62

  3. Nhận các bản ghi của tháng trước trong máy chủ SQL

  4. Làm cách nào để lấy tên cột từ một bảng trong SQL Server?

  5. Câu lệnh SQL CASE