Bài viết này sẽ giải thích khóa chính là gì và cách quản lý các ràng buộc khóa chính của PostgreSQL thông qua các câu lệnh SQL.
Khóa chính (primary key) là một cột hoặc một nhóm cột được sử dụng để xác định một hàng duy nhất trong bảng. Bạn xác định các khóa chính thông qua các ràng buộc khóa chính.
Về mặt kỹ thuật, một ràng buộc khóa chính là sự kết hợp của một ràng buộc not-null và một ràng buộc UNIQUE.
Nếu bạn tạo bảng có ràng buộc PRIMARY KEY trên cột, bạn sẽ không thể lưu trữ các giá trị trùng lặp trong cột. Tương tự như ràng buộc UNIQUE, nhưng bạn không thể lưu trữ NULL trong một cột có ràng buộc PRIMARY KEY.
1. Cách sử dụng ràng buộc PRIMARY KEY
Khi bạn tạo một bảng, bạn có thể đặt ràng buộc PRIMARY KEY trên một cột để đặt cột đó làm khóa chính cho bảng.
Các giá trị trùng lặp không thể được thêm vào các cột có ràng buộc PRIMARY KEY và không được chứa NULL.
Cú pháp như sau:
CREATE TABLE [ IF NOT EXISTS ] table_name ( column_name data_type PRIMARY KEY [, ... ] );
Câu lệnh sau tạo một bảng mới có tên employee với ràng buộc PRIMARY KEY cho cột name:
CREATE TABLE employee (
name VARCHAR (20) PRIMARY KEY,
department VARCHAR (30)
);
Ràng buộc PRIMARY KEY ở trên cũng có thể được viết lại dưới dạng ràng buộc bảng như được hiển thị trong truy vấn sau:
CREATE TABLE employee (
name VARCHAR (20),
department VARCHAR (30),
PRIMARY KEY(name)
);
Xem thông tin cột và ràng buộc đã tạo của bảng employee :
\d employee
Bây giờ, thử thêm một số dữ liệu vào bảng employee:
INSERT INTO employee VALUES ('Hoang Ngoc Minh', 'Sales'), ('Minh Hoang Blog', 'Marketing');
Những dữ liệu này có thể được thêm vào mà không có vấn đề gì vì giá trị của cột name không trùng lặp, cũng không phải NULL.
Tiếp theo, thử thêm dữ liệu bằng cách chỉ định giá trị giống như giá trị đã được lưu trữ trong bảng làm giá trị của cột name (★1):
INSERT INTO employee VALUES ('Hoang Ngoc Minh', 'Customer');
hay thêm giá trị NULL vào cột name (★2):
INSERT INTO employee VALUES (NULL, 'Legal');
việc thêm dữ liệu của cả 2 trường hợp này sẽ thất bại và nhận được thông báo lỗi như hình vì không thỏa mãn điều kiện của ràng buộc PRIMARY KEY trên cột name.
2. Cách tạo ràng buộc PRIMARY KEY trên nhiều cột
PostgreSQL cho phép bạn tạo ràng buộc PRIMARY KEY cho một nhóm cột bằng cú pháp sau:
CREATE TABLE [ IF NOT EXISTS ] table_name ( column_name1 data_type1, column_name2 data_type2, column_name3 data_type3, [... ,] [CONSTRAINT constraint_name] PRIMARY KEY ( column_name2, column_name3 [, ... ] ) )
※Nếu bạn không chỉ định rõ ràng tên cho ràng buộc khóa chính [CONSTRAINT constraint_name], PostgreSQL sẽ chỉ định tên mặc định cho ràng buộc khóa chính. Theo mặc định, PostgreSQL sử dụng table-name_pkey làm tên mặc định cho ràng buộc khóa chính.
Ở hình phía trên, bạn có thể thấy PostgreSQL đã tạo ràng buộc khóa chính với tên employee_pkey cho bảng employee.
Ví dụ tạo bảng employee1 có chỉ định tên pkey_name_email cho ràng buộc khóa chính:
CREATE TABLE employee1 (
name VARCHAR (20),
department VARCHAR (30),
email VARCHAR (30),
CONSTRAINT pkey_name_email PRIMARY KEY(name,email)
);
Xem thông tin cột và ràng buộc đã tạo của bảng employee1:
\d employee1
Và cũng giống như các ví dụ ở (★1) và (★2) thì cũng không thể thêm các giá trị trùng lặp, hay NULL vào cột khóa chính là name, email của bảng employee1.
3. Thêm ràng buộc PRIMARY KEY cho cột của bảng đã tồn tại
Rất hiếm khi thêm ràng buộc PRIMARY KEY cho bảng hiện có. Trong trường hợp phải làm điều đó, bạn có thể sử dụng câu lệnh ALTER TABLE để thêm ràng buộc khóa chính:
ALTER TABLE table_name ADD PRIMARY KEY (column_1, column_2);
Câu lệnh sau tạo một bảng có tên là products mà không xác định bất kỳ khóa chính nào:
CREATE TABLE products ( product_no INTEGER, description TEXT, product_cost NUMERIC );
Giả sử bạn muốn thêm ràng buộc khóa chính PRIMARY KEY vào bảng products cho cột product_no, bạn có thể thực hiện câu lệnh sau:
ALTER TABLE products ADD PRIMARY KEY (product_no);
4. Cách thêm khóa chính tăng tự động vào bảng hiện có
Giả sử, chúng ta có một bảng vendors không có bất kỳ khóa chính nào:
CREATE TABLE vendors (name VARCHAR(50));
Sau đó, thêm một vài hàng vào bảng vendors bằng cách sử dụng câu lệnh INSERT:
INSERT INTO vendors VALUES ('Microsoft'), ('IBM'), ('Apple'), ('Samsung');
Sử dụng câu lệnh SELECT để xác nhận thông tin đã được thêm vào bảng vendors:
SELECT * FROM vendors;
Bây giờ, nếu chúng ta muốn thêm một khóa chính có tên id vào bảng vendors và trường id được tự động tăng lên một, chúng ta sử dụng câu lệnh sau:
ALTER TABLE vendors ADD COLUMN ID SERIAL PRIMARY KEY;
Kiểm tra lại dữ liệu của bảng vendors một lần nữa:
SELECT id,name FROM vendors;
Khóa chính là giá trị của cột id tăng tự động đã được thêm vào bảng vendors.
5. Cách xóa ràng buộc PRIMARY KEY
Để loại bỏ ràng buộc khóa chính PRIMARY KEY hiện có, bạn cũng sử dụng câu lệnh ALTER TABLE với cú pháp sau:
ALTER TABLE table_name DROP CONSTRAINT primary_key_constraint_name;
Ví dụ: để loại bỏ ràng buộc khóa chính pkey_name_email của bảng employee1 đã tạo ở , bạn sử dụng câu lệnh sau:
ALTER TABLE employee1 DROP CONSTRAINT pkey_name_email;
[…] tham chiếu refcolumn bởi ràng buộc khóa ngoại FOREIGN KEY BẮT BUỘC PHẢI CÓ ràng buộc khóa chính PRIMARY KEY hoặc ràng buộc duy nhất […]
[…] ALWAYS AS IDENTITY sẽ thiết lập cột id tự động ràng buộc NOT NULL, chứ không ràng buộc PRIMARY KEY nên hoàn toàn có thể thêm giá trị của cột id giống […]