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

Cách thêm khóa chính vào bảng hiện có trong SQL Server (ví dụ T-SQL)

Bài viết này trình bày cách thêm khóa chính vào bảng hiện có trong SQL Server bằng Transact-SQL.

Khóa chính là một cột đã được định cấu hình làm mã định danh duy nhất cho một bảng nhất định.

Thông thường, bạn sẽ tạo ràng buộc khóa chính khi tạo bảng, nhưng bạn cũng có thể thêm khóa chính vào bảng hiện có.

Lưu ý rằng một bảng chỉ có thể có một khóa chính. Vì vậy, bạn không thể thêm khóa chính nếu bảng đã có khóa.

Ngoài ra, khóa chính chỉ có thể được thêm vào các cột được xác định là NOT NULL .

Ví dụ 1 - Thêm Ràng buộc Khóa Chính

Trong ví dụ này, tôi tạo một bảng, nhưng tôi quên thêm một ràng buộc khóa chính. Vì vậy, sau đó tôi quay lại và thay đổi bảng để có khóa chính.

Tạo bảng (nhưng quên tạo khóa chính ):

USE Test;

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

Kết quả:

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

Rất tiếc - Tôi quên tạo khóa chính!

Không vấn đề gì! Chúng tôi có thể thêm một cái ngay bây giờ:

ALTER TABLE Colors
ADD CONSTRAINT PK_Colors_ColorId PRIMARY KEY CLUSTERED (ColorId);

Kết quả:

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

Điều này hiện đã thêm một PRIMARY KEY ràng buộc cho ColorId cột.

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

Hãy 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__MyTest__606C418F16F9CCCF | PK     | 1                 | 1                 |
| PK__Client__96ADCE1ACB91C2A9 | PK     | 1                 | 1                 |
| PK_Colors_ColorId            | PK     | 1                 | 0                 |
+------------------------------+--------+-------------------+-------------------+

Kết quả của bạn sẽ khác nhau, tùy thuộc vào khóa chính trong cơ sở dữ liệu của bạn.

Cũng xin lưu ý rằng chế độ xem hệ thống này trả về nhiều cột hơn những gì tôi đã chỉ định ở đây, nhưng bạ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.

Ví dụ 3 - Thêm khóa chính vào cột cho phép giá trị NULL

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

Để 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 cũng sẽ quên chỉ định cột là NOT NULL :

USE Test;

CREATE TABLE Colors2
(
    ColorId int,
    ColorName varchar(50)
);

Chúng ta có thể chạy truy vấn sau để kiểm tra xem cột có cho phép null hay không:

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 = 'ColorId';

Kết quả:

+---------+----------+---------------+---------------+
| Table   | Column   | is_nullable   | is_identity   |
|---------+----------+---------------+---------------|
| Colors  | ColorId  | 0             | 1             |
| Colors2 | ColorId  | 1             | 0             |
+---------+----------+---------------+---------------+

Chúng ta có thể thấy rằng màu mà chúng ta đã tạo trước đó (trong Colors bảng) là nullable và là một cột nhận dạng. Cái thứ hai (trong Colors2 bảng) là không thể trống và không phải là một cột nhận dạng.

Bây giờ chúng ta hãy thử thêm một ràng buộc khóa chính vào cột nullable:

ALTER TABLE Colors2
ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);

Kết quả:

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

Vì vậy, trong trường hợp này, chúng tôi sẽ cần thay đổi cột thành NOT NULL trước khi chúng tôi cố gắng xác định nó là khóa chính.

Chúng ta có thể sử dụng ALTER COLUMN trong ALTER TABLE câu lệnh để đặt cột này thành NOT NULL :

ALTER TABLE Colors2
ALTER COLUMN ColorId int NOT NULL;

Hãy kiểm tra lại cột:

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 = 'ColorId';

Kết quả:

+---------+----------+---------------+---------------+
| Table   | Column   | is_nullable   | is_identity   |
|---------+----------+---------------+---------------|
| Colors  | ColorId  | 0             | 1             |
| Colors2 | ColorId  | 0             | 0             |
+---------+----------+---------------+---------------+

Vì vậy, chúng ta có thể thấy rằng Colors2 hiện được đặt thành 0 , có nghĩa là nó không thể nullable (nó không thể chứa giá trị NULL).

Cũng xin lưu ý rằng cột này không một cột nhận dạng. Tôi sẽ thảo luận điều này sau.

Dù sao, bây giờ cột được xác định là NOT NULL chúng ta có thể tiếp tục và thêm khóa chính:

ALTER TABLE Colors2
ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);

Kết quả:

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

Để xác minh, hãy kiểm tra lại tất cả các ràng buộc khóa chính cho bảng này:

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__MyTest__606C418F16F9CCCF | PK     | 1                 | 1                 |
| PK__Client__96ADCE1ACB91C2A9 | PK     | 1                 | 1                 |
| PK_Colors_ColorId            | PK     | 1                 | 0                 |
| PK_Colors2_ColorId           | PK     | 1                 | 0                 |
+------------------------------+--------+-------------------+-------------------+

Khóa chính mới mà chúng tôi gọi là PK_Colors2_ColorId đã được thêm vào danh sách.

Ví dụ 4 - Thay đổi một cột thành một cột nhận dạng

Khóa chính thường được áp dụng cho các cột nhận dạng. Các cột nhận dạng được xác định như vậy với IDENTITY từ khóa, theo sau là giá trị khởi đầu và gia tăng tùy chọn trong dấu ngoặc đơn.

Khi một hàng mới được thêm vào bảng, SQL Server cung cấp một giá trị gia tăng, duy nhất cho cột danh tính.

Nếu bạn định sử dụng cột nhận dạng, bạn cần phải làm điều đó. Bạn không thể thay đổi cột hiện có thành cột nhận dạng.

Khi tôi chạy truy vấn trước đó, chúng tôi có thể thấy rằng Colors2.ColorId cột là không cột danh tính (chúng tôi biết điều này vì is_identity được đặt thành 0 ). Điều này có nghĩa là tôi đã tạo PK_Colors2_ColorId khóa chính trên một cột không phải danh tính.

Dưới đây là những gì sẽ xảy ra nếu chúng tôi cố gắng thay đổi bảng thành một cột nhận dạng:

ALTER TABLE Colors2
ALTER COLUMN 
  ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY;

Kết quả:

Msg 156, Level 15, State 1, Line 3
Incorrect syntax near the keyword 'IDENTITY'.

Như đã nói, để khắc phục điều này, chúng ta cần phải bỏ cột và bắt đầu lại.

Nếu cột đã chứa dữ liệu, bạn sẽ cần thực hiện thêm một số công việc. Điều đó nằm ngoài phạm vi của bài viết này, nhưng đây là một ví dụ về việc loại bỏ cột ở trên và tạo lại nó làm cột nhận dạng:

USE Test; 

DROP TABLE Colors2;

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

Kết quả:

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

Lưu ý rằng lần này tôi không cung cấp tên cho ràng buộc khóa chính. Trong trường hợp này, hệ thống sẽ tạo một tên cho nó.

Kiểm tra nhanh cột:

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 = 'ColorId';

Kết quả:

+---------+----------+---------------+---------------+
| Table   | Column   | is_nullable   | is_identity   |
|---------+----------+---------------+---------------|
| Colors  | ColorId  | 0             | 1             |
| Colors2 | ColorId  | 0             | 1             |
+---------+----------+---------------+---------------+

Có, bây giờ nó là một cột nhận dạng.

Hãy cùng xem xét các khóa chính cho bảng này:

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__MyTest__606C418F16F9CCCF  | PK     | 1                 | 1                 |
| PK__Client__96ADCE1ACB91C2A9  | PK     | 1                 | 1                 |
| PK_Colors_ColorId             | PK     | 1                 | 0                 |
| PK__Colors2__8DA7674D8F57294D | PK     | 1                 | 1                 |
+-------------------------------+--------+-------------------+-------------------+

Vì vậy, bây giờ chúng ta có một khóa chính được đặt tên hệ thống được gọi là PK__Colors2__8DA7674D8F57294D .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL:chỉ viết hoa chữ cái đầu tiên

  2. TSQL - Thêm cột vào tất cả các bảng trong cơ sở dữ liệu [Ví dụ về con trỏ]

  3. Không cập nhật được cơ sở dữ liệu .mdf vì cơ sở dữ liệu ở chế độ chỉ đọc (ứng dụng Windows)

  4. Tìm kiếm đối tượng cơ sở dữ liệu và dữ liệu bảng trong SQL Server

  5. Ví dụ về Chuyển đổi 'time' thành 'datetime' trong SQL Server (T-SQL)