SQL - Ràng buộc: Chìa khóa của tính toàn vẹn dữ liệu
Xin chào các nhà法师 cơ sở dữ liệu tương lai! Tôi rất vui mừng được làm hướng dẫn viên của bạn trong hành trình thú vị vào thế giới của các ràng buộc SQL. Với tư cách là người đã dạy SQL hơn một thập kỷ, tôi có thể đảm bảo với bạn rằng việc hiểu các ràng buộc giống như mở ra một siêu năng lực bí mật trong quản lý cơ sở dữ liệu. Hãy cùng lặn sâu vào nhé!
SQL Constraints 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 bài cần được đặt chính xác,否则 toàn bộ cấu trúc có thể đổ xuống. Các ràng buộc SQL giống như những quy tắc giúp ngôi nhà "bài" của cơ sở dữ liệu bạn đứng vững. Chúng đảm bảo rằng dữ liệu trong bảng của bạn tuân theo các quy tắc cụ thể, duy trì độ chính xác và nhất quán.
Tại Sao Các Ràng Buộc Quan Trọng?
Hãy để tôi chia sẻ một câu chuyện nhanh. Tôi từng có một học viên đã xây dựng một cơ sở dữ liệu cho một cửa hàng thú cưng mà không sử dụng các ràng buộc. Một ngày nọ, họ vô tình nhập giá trị âm cho một chú chó con. Ngay lập tức, mọi người được trả tiền để nhận nuôi chó! Đó là hỗn loạn (nhưng những chú chó rất vui). Đó là lý do chúng ta cần các ràng buộc - để ngăn chặn những tình huống hài hước nhưng gây ra vấn đề như vậy.
SQL Constraints: Đội Hình
Dưới đây là bảng của các ràng buộc SQL chính mà chúng ta sẽ khám phá:
Ràng Buộc | Mô Tả |
---|---|
NOT NULL | Đảm bảo rằng một cột không thể có giá trị NULL |
UNIQUE | Đảm bảo rằng tất cả các giá trị trong một cột đều khác nhau |
PRIMARY KEY | Kết hợp NOT NULL và UNIQUE |
FOREIGN KEY | Đảm bảo tính toàn vẹn tham chiếu giữa các bảng |
CHECK | Đảm bảo rằng tất cả các giá trị trong một cột thỏa mãn một điều kiện cụ thể |
DEFAULT | Đặt giá trị mặc định cho một cột |
INDEX | Sử dụng để tạo và truy xuất dữ liệu từ cơ sở dữ liệu nhanh chóng |
Bây giờ, hãy phân tích chúng một một.
Tạo Ràng Buộc trong SQL
Các ràng buộc có thể được thêm vào khi bạn lần đầu tiên tạo một bảng hoặc sau đó bằng cách sử dụng lệnh ALTER TABLE. Hãy bắt đầu với việc tạo một bảng đơn giản cho cửa hàng thú cưng giả tưởng của chúng ta:
CREATE TABLE pets (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
species VARCHAR(50) NOT NULL,
age INT CHECK (age >= 0),
price DECIMAL(10, 2) NOT NULL CHECK (price > 0),
adoption_date DATE DEFAULT NULL
);
Bảng đơn giản này đã bao gồm nhiều ràng buộc. Hãy phân tích chúng:
Ràng Buộc NOT NULL
Ràng buộc NOT NULL đảm bảo rằng một cột không thể có giá trị NULL. Trong ví dụ của chúng ta, 'id', 'name', 'species', và 'price' đều là NOT NULL. Điều này có nghĩa là mỗi thú cưng phải có những chi tiết này được điền vào.
name VARCHAR(50) NOT NULL,
Ràng Buộc UNIQUE Key
Trong khi chúng ta không sử dụng UNIQUE một cách rõ ràng ở đây, điều này值得一提. Ràng buộc UNIQUE đảm bảo rằng tất cả các giá trị trong một cột đều khác nhau. Ví dụ, nếu chúng ta muốn mỗi thú cưng có một số microchip duy nhất:
ALTER TABLE pets
ADD COLUMN microchip_number VARCHAR(20) UNIQUE;
Ràng Buộc DEFAULT Value
Ràng buộc DEFAULT cung cấp giá trị mặc định cho một cột khi không có giá trị được chỉ định. Trong ví dụ của chúng ta, 'adoption_date' có DEFAULT là NULL, có nghĩa là nếu không có ngày được cung cấp, nó sẽ là NULL.
adoption_date DATE DEFAULT NULL
Ràng Buộc PRIMARY Key
Ràng buộc PRIMARY KEY duy nhất xác định mỗi bản ghi trong bảng. Nó là sự kết hợp của NOT NULL và UNIQUE. Trong bảng của chúng ta, 'id' là khóa chính:
id INT NOT NULL PRIMARY KEY,
Ràng Buộc FOREIGN Key
Ràng buộc FOREIGN KEY được sử dụng để ngăn chặn các hành động có thể phá vỡ liên kết giữa các bảng. Hãy thêm một bảng owners và liên kết nó với bảng pets của chúng ta:
CREATE TABLE owners (
owner_id INT NOT NULL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
ALTER TABLE pets
ADD COLUMN owner_id INT,
ADD CONSTRAINT fk_owner
FOREIGN KEY (owner_id) REFERENCES owners(owner_id);
Bây giờ, bạn không thể thêm một thú cưng với owner_id không tồn tại trong bảng owners. Đó giống như đảm bảo mỗi thú cưng có một ngôi nhà thực sự!
Ràng Buộc CHECK Value
Ràng buộc CHECK đảm bảo rằng tất cả các giá trị trong một cột thỏa mãn một điều kiện cụ thể. Trong bảng pets của chúng ta, chúng tôi sử dụng nó để đảm bảo rằng tuổi và giá cả là dương:
age INT CHECK (age >= 0),
price DECIMAL(10, 2) NOT NULL CHECK (price > 0),
Ràng Buộc INDEX
Mặc dù không phải là một ràng buộc, INDEX rất quan trọng đối với hiệu suất cơ sở dữ liệu. Chúng giống như mục lục ở cuối một cuốn sách, giúp SQL tìm dữ liệu nhanh chóng:
CREATE INDEX idx_species ON pets(species);
Điều này tạo một chỉ mục trên cột species, làm cho việc tìm kiếm theo species nhanh hơn nhiều.
Xóa Ràng Buộc SQL
Đôi khi, bạn có thể cần xóa bỏ một ràng buộc. Dưới đây là cách bạn có thể làm điều đó:
ALTER TABLE pets
DROP CONSTRAINT check_price;
Điều này sẽ xóa bỏ ràng buộc CHECK trên cột price.
Ràng Buộc Tính Toàn Vẹn Dữ Liệu: Kết Hợp Tất Cả
Tất cả các ràng buộc này hoạt động cùng nhau để đảm bảo tính toàn vẹn dữ liệu. Chúng giống như hệ miễn dịch của cơ sở dữ liệu của bạn, bảo vệ nó khỏi dữ liệu xấu. Hãy xem một ví dụ phức tạp hơn:
CREATE TABLE adoptions (
adoption_id INT NOT NULL PRIMARY KEY,
pet_id INT NOT NULL,
owner_id INT NOT NULL,
adoption_date DATE DEFAULT CURRENT_DATE,
adoption_fee DECIMAL(10, 2) CHECK (adoption_fee >= 0),
FOREIGN KEY (pet_id) REFERENCES pets(id),
FOREIGN KEY (owner_id) REFERENCES owners(owner_id),
UNIQUE (pet_id, adoption_date)
);
Bảng này đảm bảo:
- Mỗi adopção có một ID duy nhất (PRIMARY KEY)
- Mỗi adopção được liên kết với một thú cưng và chủ hợp lệ (FOREIGN KEY)
- Phí adopção không thể là âm (CHECK)
- Nếu không có ngày adopção được chỉ định, nó sẽ mặc định là ngày hiện tại (DEFAULT)
- Một thú cưng không thể được adopção hai lần trong cùng một ngày (UNIQUE kết hợp)
Và thế là xong! Bây giờ bạn đã được trang bị đầy đủ để giữ cho cơ sở dữ liệu của bạn sạch sẽ, nhất quán và không có lỗi với các ràng buộc SQL. Nhớ rằng, một cơ sở dữ liệu được ràng buộc tốt là một cơ sở dữ liệu hạnh phúc. Chúc may mắn, các nhà法师 dữ liệu tương lai!
Credits: Image by storyset