Ràng buộc FOREIGN KEY trong SQL là một công cụ quan trọng trong cơ sở dữ liệu quan hệ để xác lập mối quan hệ giữa hai bảng thông qua việc liên kết các cột trong một bảng với các cột trong bảng khác. Ràng buộc này đảm bảo tính nhất quán và tính hợp lệ của dữ liệu giữa các bảng.
Cú pháp FOREIGN KEY trong SQL
Cú pháp của ràng buộc FOREIGN KEY trong SQL như sau:
CREATE TABLE tên_bảng ( cột1 kiểu_dữ_liệu, cột2 kiểu_dữ_liệu, ..., FOREIGN KEY (tên_cột) REFERENCES tên_bảng_tham_chiếu (tên_cột_tham_chiếu) );
Trong đó:
tên_bảng
là tên của bảng mà ràng buộc FOREIGN KEY được định nghĩa.tên_cột
là tên của cột mà ràng buộc FOREIGN KEY được định nghĩa.tên_bảng_tham_chiếu
vàtên_cột_tham_chiếu
là tên của bảng và cột mà ràng buộc FOREIGN KEY tham chiếu đến.
Ví dụ về ràng buộc FOREIGN KEY
Ví dụ dưới đây minh họa một ràng buộc FOREIGN KEY trong SQL:
Trong ví dụ này, trường customer_id
trong bảng Orders là một FOREIGN KEY tham chiếu đến trường customer_id
trong bảng Customers. Điều này có nghĩa là giá trị của trường customer_id
(trong bảng Orders) phải là một giá trị từ cột customer_id
(trong bảng Customers).
Lưu ý: Ràng buộc FOREIGN KEY có thể tham chiếu đến bất kỳ cột nào trong bảng cha. Tuy nhiên, tốt nhất là tham chiếu FOREIGN KEY đến khóa chính của bảng cha.
Tạo ràng buộc FOREIGN KEY
Bây giờ, chúng ta hãy xem cách tạo ràng buộc FOREIGN KEY trong cơ sở dữ liệu.
Dưới đây là ví dụ về việc tạo ràng buộc FOREIGN KEY:
CREATE TABLE Customers ( id INT, first_name VARCHAR(40), last_name VARCHAR(40), age INT, country VARCHAR(10), CONSTRAINT CustomersPK PRIMARY KEY (id) ); CREATE TABLE Orders ( order_id INT, product VARCHAR(40), total INT, customer_id INT, CONSTRAINT OrdersPK PRIMARY KEY (order_id), FOREIGN KEY (customer_id) REFERENCES Customers(id) );
Trong ví dụ này, giá trị của cột customer_id
trong bảng Orders tham chiếu đến một hàng trong bảng Customers thông qua cột id
.
Lưu ý: Mã trên hoạt động trên hầu hết các hệ thống cơ sở dữ liệu chính. Tuy nhiên, cú pháp tạo ràng buộc FOREIGN KEY có thể thay đổi tùy thuộc vào cơ sở dữ liệu. Vui lòng tham khảo tài liệu cơ sở dữ liệu tương ứng để biết thêm thông tin.
Chèn bản ghi vào bảng có FOREIGN KEY
Hãy thử chèn bản ghi vào bảng có FOREIGN KEY bằng cách sử dụng câu lệnh SQL INSERT INTO.
Dưới đây là ví dụ về việc chèn bản ghi vào bảng có FOREIGN KEY:
-- Chèn bản ghi vào bảng không có FOREIGN KEY trước INSERT INTO Customers VALUES (1, 'John', 'Doe', 31, 'USA'), (2, 'Robert', 'Luna', 22, 'USA'); -- Chèn bản ghi vào bảng có ràng buộc FOREIGN KEY trong cột customer_id INSERT INTO Orders VALUES (1, 'Keyboard', 400, 2), (2, 'Mouse', 300, 2), (3, 'Monitor', 12000, 1);
Trong ví dụ này, câu truy vấn được thực thi thành công vì các hàng chúng ta đang cố gắng chèn vào bảng Orders có giá trị hợp lệ trong cột customer_id
, mà có ràng buộc FOREIGN KEY trong bảng Customers.
Lỗi chèn vào FOREIGN KEY
Lỗi chèn vào FOREIGN KEY xảy ra khi một giá trị được nhập vào cột foreign key của một bảng mà không khớp với bất kỳ giá trị nào trong cột khóa chính của bảng liên quan. Ví dụ:
-- Chèn bản ghi vào bảng không có FOREIGN KEY trước INSERT INTO Customers VALUES (1, 'John', 'Doe', 31, 'USA'), (2, 'Robert', 'Luna', 22, 'USA'); -- Chèn bản ghi vào bảng có FOREIGN KEY - lỗi chèn vì khách hàng có id là 7 không tồn tại INSERT INTO Orders VALUES (4, 'Keyboard', 400, 7);
Trong ví dụ này, việc chèn các hàng vào bảng Orders thất bại vì giá trị 7
không phải là giá trị customer_id hợp lệ trong bảng Customers. Do đó, câu truy vấn này không đáp ứng được ràng buộc FOREIGN KEY.
Tại sao sử dụng FOREIGN KEY?
Ràng buộc FOREIGN KEY rất quan trọng trong cơ sở dữ liệu quan hệ và chúng ta sử dụng chúng vì những lý do sau:
1. Chuẩn hóa dữ liệu Ràng buộc FOREIGN KEY giúp chuẩn hóa dữ liệu trong nhiều bảng và giảm sự lặp lại. Điều này có nghĩa là một cơ sở dữ liệu có thể có nhiều bảng có mối quan hệ với nhau.
2. Ngăn chặn việc chèn dữ liệu sai Nếu hai bảng cơ sở dữ liệu có mối quan hệ thông qua một trường (thuộc tính), việc sử dụng FOREIGN KEY đảm bảo rằng dữ liệu sai không được chèn vào trường đó. Điều này giúp loại bỏ các lỗi cấp độ cơ sở dữ liệu.
Ràng buộc FOREIGN KEY với ALTER TABLE
Có thể thêm ràng buộc FOREIGN KEY vào một bảng hiện có bằng cách sử dụng câu lệnh ALTER TABLE.
Dưới đây là ví dụ về việc thêm ràng buộc FOREIGN KEY:
CREATE TABLE Customers ( id INT, first_name VARCHAR(40), last_name VARCHAR(40), age INT, country VARCHAR(10), CONSTRAINT CustomersPK PRIMARY KEY (id) ); CREATE TABLE Orders ( order_id INT, item VARCHAR(40), amount INT, customer_id INT, CONSTRAINT OrdersPK PRIMARY KEY (order_id) ); -- Thêm ràng buộc FOREIGN KEY vào cột customer_id trong Orders, tham chiếu đến cột id trong Customers ALTER TABLE Orders ADD FOREIGN KEY (customer_id) REFERENCES Customers(id);
Lưu ý: Hành động này không được hỗ trợ trên trình chỉnh sửa SQL trực tuyến của chúng tôi vì nó dựa trên SQLite.
Nhiều FOREIGN KEY trong một bảng
Một bảng cơ sở dữ liệu cũng có thể có nhiều ràng buộc FOREIGN KEY.
Ví dụ, giả sử chúng ta cần ghi lại tất cả các giao dịch mà mỗi người dùng đều là người mua và người bán.
Dưới đây là ví dụ về việc tạo nhiều ràng buộc FOREIGN KEY trong một bảng:
CREATE TABLE Users ( id INT PRIMARY KEY, first_name VARCHAR(40), last_name VARCHAR(40), age INT, country VARCHAR(10) ); CREATE TABLE Transactions ( transaction_id INT PRIMARY KEY, amount INT, seller INT, buyer INT, CONSTRAINT fk_seller FOREIGN KEY (seller) REFERENCES Users(id), CONSTRAINT fk_buyer FOREIGN KEY (buyer) REFERENCES Users(id) );
Trong ví dụ này, lệnh SQL tạo hai ràng buộc FOREIGN KEY (buyer và seller) trong bảng Transactions.
Lưu ý: Như các ràng buộc khác, việc đặt tên cho ràng buộc FOREIGN KEY bằng cú pháp CONSTRAINT tên_ràng_buộc là tùy chọn. Nhưng việc làm như vậy giúp dễ dàng thay đổi hoặc xóa ràng buộc. Điều này đặc biệt hữu ích khi định nghĩa nhiều ràng buộc.
Kết
Ràng buộc FOREIGN KEY là một công cụ quan trọng trong cơ sở dữ liệu quan hệ và chúng ta sử dụng chúng để chuẩn hóa dữ liệu và ngăn chặn việc chèn dữ liệu sai. Chúng cũng giúp mô hình hóa mối quan hệ giữa các bảng và tạo ra các cơ sở dữ liệu hiệu quả. Để biết thêm thông tin, hãy tham khảo tài liệu SQL Constraints và SQL PRIMARY KEY Constraint.