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

Cách tạo khóa chính trong SQL Server (Ví dụ T-SQL)

Bài viết này trình bày cách tạo khóa chính trong SQL Server khi tạo bảng bằng Transact-SQL.

Khóa chính là một hoặc nhiều cột đã được định cấu hình làm mã định danh duy nhất cho một bảng nhất định. Khóa chính có thể được sử dụng để thực thi tính toàn vẹn của dữ liệu trong bảng.

Một bảng chỉ có thể có một khóa chính và khóa chính chỉ có thể được thêm vào các cột được xác định là NOT NULL .

Bài viết này trình bày cách tạo khóa chính trong mới bảng (tức là khi tạo bảng). Nếu bạn cần tạo khóa chính trong hiện có bảng, hãy xem Cách thêm khóa chính vào bảng hiện có trong SQL Server.

Ví dụ 1 - Tạo Bảng bằng Khóa chính

Đầu tiên, tôi sẽ tạo một cơ sở dữ liệu thử nghiệm:

CREATE DATABASE PK_Test;

Bây giờ, hãy tạo một bảng mới có ràng buộc khóa chính:

USE PK_Test;

CREATE TABLE Colors
(
    ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY,
    ColorName varchar(50)
);

Điều này đã tạo ra một bảng mới có tên là Colors có ràng buộc khóa chính trên ColorId của nó cột.

Ví dụ 2 - Kiểm tra Ràng buộc Khóa Chính

Chúng ta có thể chạy đoạn mã sau để trả về danh sách các ràng buộc khóa chính trong cơ sở dữ liệu:

SELECT
  name,
  type,
  unique_index_id,
  is_system_named
FROM sys.key_constraints
WHERE type = 'PK';

Kết quả:

+------------------------------+--------+-------------------+-------------------+
| name                         | type   | unique_index_id   | is_system_named   |
|------------------------------+--------+-------------------+-------------------|
| PK__Colors__8DA7674DD34F4585 | PK     | 1                 | 1                 |
+------------------------------+--------+-------------------+-------------------+

Tôi đã thu hẹp các cột cho ví dụ này. sys.key_constraints chế độ xem hệ thống trả về nhiều cột hơn giá trị này. Bạn luôn có thể sử dụng * ký tự đại diện để trả về tất cả các cột nếu bạn muốn.

Qua kết quả truy vấn, chúng tôi có thể thấy rằng cơ sở dữ liệu này chỉ có một khóa chính (khóa chúng tôi vừa tạo).

Trong trường hợp này, khóa chính đã được hệ thống đặt tên tự động. Bạn cũng có tùy chọn cung cấp tên của chính mình (sẽ tìm hiểu thêm về điều đó ở phần sau).

Ví dụ 3 - Kiểm tra Chỉ mục

Theo mặc định, một chỉ mục nhóm được tạo khi bạn tạo khóa chính. Bạn có thể chỉ định chỉ mục nhóm một cách rõ ràng hoặc để nó được tạo tự động. Bạn cũng có tùy chọn chỉ định chỉ mục không phân biệt.

Đây là một truy vấn trả về chỉ mục được tạo tự động khi tôi tạo khóa chính ở trên:

SELECT *
FROM sys.indexes
WHERE name = 'PK__Colors__8DA7674DD34F4585';

Kết quả (sử dụng đầu ra dọc):

object_id                  | 885578193
name                       | PK__Colors__8DA7674DD34F4585
index_id                   | 1
type                       | 1
type_desc                  | CLUSTERED
is_unique                  | 1
data_space_id              | 1
ignore_dup_key             | 0
is_primary_key             | 1
is_unique_constraint       | 0
fill_factor                | 0
is_padded                  | 0
is_disabled                | 0
is_hypothetical            | 0
is_ignored_in_optimization | 0
allow_row_locks            | 1
allow_page_locks           | 1
has_filter                 | 0
filter_definition          | NULL
compression_delay          | NULL
suppress_dup_key_messages  | 0
auto_created               | 0

Trong trường hợp này, tôi đã thu hẹp kết quả thành chỉ hàng chứa cùng tên của khóa chính mà tôi vừa tạo. Bạn luôn có thể xóa WHERE nếu bạn cần thêm kết quả được trả về.

Chúng ta có thể thấy rằng chỉ mục này có type_desc trong tổng số CLUSTERED .

Ví dụ 4 - Đặt tên cho Khóa chính

Khóa chính mà chúng tôi tạo ở trên đã được hệ thống đặt tên tự động. Bạn có thể cung cấp tên của chính mình nếu bạn muốn.

Dưới đây là một ví dụ về cách chỉ định tên cho khóa chính. Trong trường hợp này, tôi cũng chỉ định một chỉ mục không hợp nhất.

USE PK_Test;

CREATE TABLE Cats
(
    CatId int IDENTITY (1,1) NOT NULL, 
       CONSTRAINT PK_Cats_CatId PRIMARY KEY NONCLUSTERED (CatId),
    CatName varchar(50)
);

Trong trường hợp này, tôi sử dụng CONSTRAINT tùy chọn từ khóa để chỉ ra phần bắt đầu của định nghĩa khóa chính, theo sau là tên tôi đã chọn cho khóa chính. Tôi cũng sử dụng NONCLUSTERED từ khóa để xác định rằng một chỉ mục không hợp nhất.

Kiểm tra khóa chính:

SELECT
  name,
  type,
  unique_index_id,
  is_system_named
FROM sys.key_constraints
WHERE type = 'PK';

Kết quả:

+------------------------------+--------+-------------------+-------------------+
| name                         | type   | unique_index_id   | is_system_named   |
|------------------------------+--------+-------------------+-------------------|
| PK__Colors__8DA7674DD34F4585 | PK     | 1                 | 1                 |
| PK_Cats_CatId                | PK     | 2                 | 0                 |
+------------------------------+--------+-------------------+-------------------+

Kiểm tra chỉ mục:

SELECT *
FROM sys.indexes
WHERE name = 'PK_Cats_CatId';

Kết quả (sử dụng đầu ra dọc):

object_id                  | 917578307
name                       | PK_Cats_CatId
index_id                   | 2
type                       | 2
type_desc                  | NONCLUSTERED
is_unique                  | 1
data_space_id              | 1
ignore_dup_key             | 0
is_primary_key             | 1
is_unique_constraint       | 0
fill_factor                | 0
is_padded                  | 0
is_disabled                | 0
is_hypothetical            | 0
is_ignored_in_optimization | 0
allow_row_locks            | 1
allow_page_locks           | 1
has_filter                 | 0
filter_definition          | NULL
compression_delay          | NULL
suppress_dup_key_messages  | 0
auto_created               | 0

Vì vậy, chúng ta có thể thấy rằng lần này type_desc KHÔNG ĐƯỢC ĐIỀU CHỈNH .

Lưu ý rằng khi tạo bảng, CLUSTERED chỉ có thể được chỉ định cho một ràng buộc. Nếu nó được chỉ định cho một UNIQUE ràng buộc và một PRIMARY KEY ràng buộc cũng được chỉ định, PRIMARY KEY mặc định thành NONCLUSTERED .

Ví dụ 5 - Tạo khóa chính trên cột không thể xóa

Khóa chính chỉ có thể được tạo cho các cột được xác định là NOT NULL . Nếu bạn cố gắng tạo khóa chính trên cột được đặt thành NULL , bạn sẽ gặp lỗi.

Tuy nhiên, nếu bạn không chỉ định khả năng vô hiệu, cột sẽ được đặt thành NOT NULL theo mặc định.

Để chứng minh điều này, hãy tạo một bảng khác, nhưng lần này, chúng tôi sẽ đặt nó thành NULL :

USE PK_Test;

CREATE TABLE Dogs
(
    DogId int IDENTITY (1,1) NULL PRIMARY KEY,
    DogName varchar(50)
);

Kết quả:

Msg 8147, Level 16, State 1, Line 3
Could not create IDENTITY attribute on nullable column 'DogId', table 'Dogs'.
Msg 8111, Level 16, State 1, Line 3
Cannot define PRIMARY KEY constraint on nullable column in table 'Dogs'.
Msg 1750, Level 16, State 0, Line 3
Could not create constraint or index. See previous errors.

Như mong đợi, chúng tôi nhận được một lỗi.

Hãy xóa NULL từ định nghĩa bảng và thử lại:

USE PK_Test;

CREATE TABLE Dogs
(
    DogId int IDENTITY (1,1) PRIMARY KEY,
    DogName varchar(50)
);

Kết quả:

Commands completed successfully.
Total execution time: 00:00:00.015

Lần này bảng đã được tạo thành công.

Hãy xem qua:

SELECT 
  t.name AS 'Table',
  c.name AS 'Column', 
  c.is_nullable,
  c.is_identity
FROM sys.columns c
INNER JOIN sys.tables T
ON c.object_id = t.object_id
WHERE c.name = 'DogId';

Kết quả:

+---------+----------+---------------+---------------+
| Table   | Column   | is_nullable   | is_identity   |
|---------+----------+---------------+---------------|
| Dogs    | DogId    | 0             | 1             |
+---------+----------+---------------+---------------+

Vì vậy, chúng ta có thể thấy rằng nó không thể nullable, vì is_nullable cờ được đặt thành 0 .

Ví dụ 6 - Khóa chính trên nhiều cột

Bạn cũng có thể tạo khóa chính trên nhiều cột. Khóa chính nhiều cột còn được gọi là khóa chính tổng hợp. Để tạo khóa chính tổng hợp, chỉ cần tách các cột bằng dấu phẩy khi xác định khóa.

Như thế này:

CONSTRAINT PK_Name PRIMARY KEY (Column1, Column2)

Dưới đây là một ví dụ về trường hợp có thể sử dụng khóa chính nhiều cột:

CREATE TABLE Musician (
MusicianId int NOT NULL,
FirstName varchar(60),
LastName varchar(60),
CONSTRAINT PK_Musician PRIMARY KEY (MusicianID)
);

CREATE TABLE Band (
BandId int NOT NULL,
BandName varchar(255),
CONSTRAINT PK_Band PRIMARY KEY (BandId)
);

CREATE TABLE BandMember (
MusicianId int NOT NULL,
BandId int NOT NULL,
CONSTRAINT PK_BandMember PRIMARY KEY (MusicianID, BandId),
CONSTRAINT FK_BandMember_Band FOREIGN KEY (BandId) REFERENCES Band(BandId),
CONSTRAINT FK_BandMember_Musician FOREIGN KEY (MusicianId) REFERENCES Musician(MusicianId)
);

Trong ví dụ này, BandMember bảng có khóa chính nhiều cột. Trong trường hợp này, mỗi cột trong khóa chính cũng là một khóa ngoại đối với khóa chính của bảng khác, nhưng đây không phải là một yêu cầu bắt buộc.

Xem Cách tạo khóa chính tổng hợp trong SQL Server để có giải thích chi tiết hơn về ví dụ này.

Ngoài ra, hãy xem Cách tạo khóa ngoại tổng hợp trong SQL Server để biết ví dụ tiến thêm một bước với khóa ngoại nhiều cột tham chiếu đến khóa chính tổng hợp ở trên.


  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 lấy danh sách tất cả các ngôn ngữ trong SQL Server (T-SQL)

  2. Sự cố bảng tạm thời RODBC khi kết nối với MS SQL Server

  3. Nhận hàng trước và hàng tiếp theo từ các hàng đã chọn với điều kiện (WHERE)

  4. Lấy dữ liệu với bộ ký tự UTF-8 từ máy chủ MSSQL bằng phần mở rộng PHP FreeTDS

  5. Cách lấy lịch Quý từ một ngày trong TSQL