PostgreSQL - Ràng buộc: Hướng dẫn thân thiện về Tính toàn vẹn dữ liệu

Xin chào các法师 future database wizards! ? Hôm nay, chúng ta sẽ khám phá thế giới kỳ diệu của các ràng buộc trong PostgreSQL. Đừng lo lắng nếu bạn là người mới bắt đầu; chúng ta sẽ cùng nhau đi từng bước, và đến cuối cùng, bạn sẽ trở thành chuyên gia trong việc ràng buộc dữ liệu! Hãy cùng bắt đầu hành trình thú vị này.

PostgreSQL - Constraints

什么是 Ràng buộc?

Trước khi chúng ta bắt đầu, hãy nói về ràng buộc là gì. Hãy tưởng tượng bạn đang xây dựng một ngôi nhà bằng bài. Mỗi lá bài cần được đặt chính xác, nếu không toàn bộ cấu trúc có thể sụp đổ. Ràng buộc trong cơ sở dữ liệu giống như các quy tắc để xây dựng ngôi nhà bằng bài đó - chúng đảm bảo rằng dữ liệu của chúng ta được cấu trúc chính xác và duy trì tính toàn vẹn.

Các loại Ràng buộc

PostgreSQL cung cấp nhiều loại ràng buộc khác nhau. Hãy cùng khám phá từng loại với các ví dụ và giải thích.

Loại Ràng buộc Mô tả
NOT NULL Đảm bảo một cột không thể có giá trị NULL
UNIQUE Đảm bảo tất cả các giá trị trong một cột đều khác nhau
PRIMARY KEY Định danh duy nhất mỗi hàng trong bảng
FOREIGN KEY Liên kết dữ liệu giữa các bảng
CHECK Đảm bảo tất cả các giá trị trong một cột thỏa mãn một điều kiện cụ thể
EXCLUSION Đảm bảo rằng nếu so sánh bất kỳ hai hàng nào trên cột được chỉ định sử dụng toán tử được chỉ định, không phải tất cả các so sánh này sẽ trả về TRUE

Ràng buộc NOT NULL

Ràng buộc NOT NULL giống như một giáo viên nghiêm ngặt không chấp nhận câu trả lời trống trên bài kiểm tra. Nó đảm bảo rằng một cột phải luôn chứa giá trị.

Hãy tạo một bảng cho cửa hàng sách giả tưởng của chúng ta:

CREATE TABLE books (
book_id SERIAL PRIMARY KEY,
title VARCHAR(100) NOT NULL,
author VARCHAR(100) NOT NULL,
price DECIMAL(10, 2)
);

Trong ví dụ này, titleauthor là NOT NULL, có nghĩa là mỗi sách phải có tựa đề và tác giả. Tuy nhiên, price có thể là NULL, có lẽ cho các sách chưa được định giá.

Ràng buộc UNIQUE

Ràng buộc UNIQUE giống như việc.assign nicknames duy nhất cho bạn bè của bạn. Không ai có thể có cùng một biệt danh.

Hãy thêm một ràng buộc UNIQUE vào bảng books của chúng ta:

ALTER TABLE books
ADD CONSTRAINT unique_isbn UNIQUE (isbn);

Bây giờ, nếu chúng ta cố gắng thêm hai sách có cùng ISBN:

INSERT INTO books (title, author, isbn) VALUES ('Book 1', 'Author 1', '1234567890');
INSERT INTO books (title, author, isbn) VALUES ('Book 2', 'Author 2', '1234567890');

Lệnh INSERT thứ hai sẽ thất bại, giữ cho dữ liệu của chúng ta sạch sẽ và duy nhất!

Ràng buộc PRIMARY KEY

Ràng buộc PRIMARY KEY giống như captain của một đội thể thao - duy nhất và quan trọng. Nó định danh duy nhất mỗi hàng trong bảng.

Chúng ta đã định nghĩa một PRIMARY KEY trong bảng books (book_id), nhưng hãy tạo một bảng khác để minh họa:

CREATE TABLE customers (
customer_id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE
);

Tại đây, customer_id là PRIMARY KEY. Nó tự động tăng và duy nhất cho mỗi khách hàng mới.

Ràng buộc FOREIGN KEY

Ràng buộc FOREIGN KEY giống như các kết nối trong mạng xã hội. Chúng liên kết dữ liệu giữa các bảng.

Hãy tạo bảng orders tham chiếu đến bảng customers của chúng ta:

CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INTEGER,
order_date DATE NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

Bây giờ, chúng ta không thể thêm một đơn hàng cho một khách hàng không tồn tại trong bảng customers. Điều này giống như cố gắng gửi thư đến một địa chỉ không tồn tại!

Ràng buộc CHECK

Ràng buộc CHECK giống như một bảo vệ tại câu lạc bộ, đảm bảo chỉ có dữ liệu đúng mới được vào.

Hãy thêm một ràng buộc CHECK vào bảng books của chúng ta để đảm bảo tất cả các giá trị của sách đều dương:

ALTER TABLE books
ADD CONSTRAINT positive_price CHECK (price > 0);

Bây giờ, nếu chúng ta cố gắng thêm một sách với giá trị âm:

INSERT INTO books (title, author, price) VALUES ('Cheap Book', 'Frugal Author', -5.99);

PostgreSQL sẽ lịch sự từ chối, giữ cho dữ liệu của chúng ta logic và nhất quán.

Ràng buộc EXCLUSION

Ràng buộc EXCLUSION giống như một quy tắc phức tạp trong một trò chơi trên bàn. Nó phức tạp, nhưng mạnh mẽ khi bạn cần nó.

Hãy tưởng tượng chúng ta đang lên lịch sự kiện và muốn đảm bảo rằng không có hai sự kiện nào trùng nhau trong cùng một phòng:

CREATE TABLE events (
event_id SERIAL PRIMARY KEY,
room_no INTEGER,
event_start TIMESTAMP,
event_end TIMESTAMP,
EXCLUDE USING gist (room_no WITH =, tsrange(event_start, event_end) WITH &&)
);

Điều này đảm bảo rằng cho bất kỳ hai hàng nào, không phải tất cả các so sánh về số phòng và khoảng thời gian sẽ trả về TRUE.

Xóa Ràng buộc

Đôi khi, chúng ta cần xóa bỏ ràng buộc, giống như thay đổi quy tắc của trò chơi. Dưới đây là cách chúng ta có thể xóa bỏ ràng buộc:

-- Xóa bỏ một ràng buộc có tên
ALTER TABLE books DROP CONSTRAINT unique_isbn;

-- Xóa bỏ một PRIMARY KEY
ALTER TABLE books DROP CONSTRAINT books_pkey;

-- Xóa bỏ một FOREIGN KEY
ALTER TABLE orders DROP CONSTRAINT orders_customer_id_fkey;

Hãy nhớ rằng việc xóa bỏ ràng buộc nên được thực hiện cẩn thận, vì nó có thể ảnh hưởng đến tính toàn vẹn dữ liệu!

Kết luận

Xin chúc mừng! Bạn vừa hoàn thành một chuyến tham quan lớn về ràng buộc trong PostgreSQL. Từ NOT NULL đến EXCLUSION, bạn bây giờ đã có các công cụ để giữ cho dữ liệu của mình sạch sẽ, nhất quán và có cấu trúc tốt. Nhớ rằng việc sử dụng ràng buộc giống như xây dựng một nền móng vững chắc cho một ngôi nhà - nó có thể mất nhiều công sức upfront, nhưng sẽ giúp bạn tránh được nhiều rắc rối về sau.

Khi bạn tiếp tục hành trình với PostgreSQL, hãy thử nghiệm với các ràng buộc này. Thử kết hợp chúng theo các cách khác nhau, và bạn sẽ nhanh chóng tìm thấy mình tạo ra các thiết kế cơ sở dữ liệu mạnh mẽ và đáng tin cậy. Chúc bạn vui vẻ trong việc ràng buộc!

Credits: Image by storyset