Nếu bạn là chủ doanh nghiệp, bạn hẳn đã trải nghiệm được giá trị và nhu cầu về dữ liệu trong doanh nghiệp của mình. Có phương tiện để lưu trữ và thao tác cơ sở dữ liệu sẽ tăng thêm giá trị cho công ty.
Cơ sở dữ liệu được tổ chức theo quy ước cụ thể và cho phép bạn cấu trúc dữ liệu theo các kết nối, điều này đưa chúng ta đến gần hơn với cơ sở dữ liệu quan hệ, được áp dụng như một hình thức quản lý dữ liệu từ những năm 1970. Và trong thị trường ngày nay, cơ sở dữ liệu quan hệ được ưa chuộng vì khả năng thao tác dữ liệu.
Mặc dù có rất nhiều cơ sở dữ liệu quan hệ nhưng MySQL vẫn đứng đầu, đứng thứ hai trên thế giới theo Statista tính đến tháng 1 năm 2022.
Trong SQL Server, các ràng buộc là các quy tắc được xác định trước và các ràng buộc được thực thi trên một hoặc nhiều cột; chúng liên quan đến các giá trị trong cột và giúp duy trì tính toàn vẹn, chính xác và độ tin cậy của dữ liệu trong các cột cụ thể.
Nói một cách đơn giản, chỉ những dữ liệu đáp ứng quy tắc ràng buộc mới được chèn thành công vào cột. Thao tác chèn kết thúc nếu dữ liệu không đáp ứng tiêu chí.
Trong bài đăng này, chúng tôi giả định rằng bạn đã tìm hiểu về cơ sở dữ liệu quan hệ, đặc biệt là MySQL và mong muốn được củng cố kiến thức của mình trong lĩnh vực này. Cuối cùng, tôi sẽ chia sẻ một số mẹo để tương tác với các ràng buộc khóa ngoại.
Những ràng buộc chính – tóm tắt
Một bảng SQL có một cột hoặc một số cột chứa các giá trị khóa xác định chính xác từng hàng trong hệ thống. Cột hoặc các cột khóa chính (PK) của bảng đóng vai trò là cơ quan thực thi tính toàn vẹn thực thể cho bảng. Ràng buộc khóa chính đảm bảo dữ liệu duy nhất và thường được xác định trong cột nhận dạng.
Sau khi chỉ định các ràng buộc khóa chính cho bảng, công cụ cơ sở dữ liệu sẽ tự động thực thi tính duy nhất của dữ liệu bằng cách tạo các chỉ mục duy nhất cho mỗi cột chính. Khóa chính mang lại lợi thế duy nhất khi được sử dụng trong truy vấn, giúp truy cập nhanh vào dữ liệu.
Nếu các ràng buộc khóa chính được xác định trên nhiều cột thì nó được gọi là khóa chính tổng hợp hoặc khóa chính ghép. Trong trường hợp này, mỗi cột khóa chính có thể chứa các giá trị trùng lặp. Tuy nhiên, các giá trị kết hợp từ tất cả các cột trong khóa chính phải là duy nhất.
Một ví dụ điển hình là trường hợp bạn có một bảng có các cột `id`, `names` và `age`. Khi xác định ràng buộc khóa chính trên tổ hợp `id` và `names`, bạn có thể có các phiên bản trùng lặp của giá trị `id` hoặc `names`. Tuy nhiên, mỗi sự kết hợp phải là duy nhất để tránh các hàng trùng lặp. Vì vậy, bạn có thể có các bản ghi với `id=1` và `name=Walter` và `age-22′ và `id=1`, `name=Henry` và `age=27`, nhưng bạn không thể có bản ghi khác có `id=1` và `name=Walter` vì sự kết hợp không phải là duy nhất.
Dưới đây là một số khía cạnh quan trọng bạn nên biết:
Tóm tắt ràng buộc khóa ngoại
Khóa ngoại (FK) bao gồm một cột hoặc sự kết hợp của nhiều cột được sử dụng để tạo và liên kết liên kết giữa hai bảng và quản lý dữ liệu được lưu trữ trong bảng khóa ngoại.
Tham chiếu khóa ngoại đòi hỏi phải tạo liên kết giữa hai bảng; khi một cột hoặc các cột chứa khóa chính của bảng khác được tham chiếu bởi một hoặc nhiều cột trong bảng khác.
Trong kịch bản tham chiếu khóa ngoại, một kết nối được tạo giữa hai bảng khi một cột hoặc các cột chứa khóa chính trong một bảng được tham chiếu bởi các cột trong bảng khác.
Trong trường hợp thực tế, bạn có thể có một bảng Sales.SalesOrderHeader với khóa ngoại trỏ đến một bảng khác, Person, vì có mối quan hệ logic giữa nhân viên bán hàng và đơn đặt hàng.
Ở đây, SalesPersonID trong cột SalesOrderHeader kết hợp với cột khóa chính của bảng SalesPerson. Khóa ngoại của bảng SalesPerson là cột SalesPersonID trong SalesOrderHeader.
Mối quan hệ này xác định một quy tắc: SalesPersonID không thể có trong bảng SalesOrderHeader nếu nó không tồn tại trong bảng SalesPerson.
Một bảng có thể tham chiếu tới 253 cột và bảng khác dưới dạng khóa ngoại, còn được gọi là tham chiếu ngoài. Kể từ năm 2016, máy chủ SQL đã tăng số lượng bảng và cột có thể được tham chiếu trong một bảng duy nhất, còn được gọi là tham chiếu gửi đến, từ 253 lên 10.000. Tuy nhiên, mức tăng này đi kèm với một số hạn chế:
Ưu điểm của khóa ngoại là gì?
Như đã đề cập trước đó, các ràng buộc khóa ngoại đóng vai trò thiết yếu trong việc bảo vệ tính toàn vẹn và nhất quán của dữ liệu trong cơ sở dữ liệu quan hệ. Sau đây là phần phân tích lý do tại sao cần có ràng buộc khóa ngoại.
Chỉ số ràng buộc khóa ngoại
Ràng buộc khóa ngoại không tự động tạo các chỉ mục thích hợp như chính. Bạn có thể tạo chỉ mục cho các ràng buộc khóa ngoại theo cách thủ công; điều này là thuận lợi vì những lý do sau.
- Các cột khóa ngoài thường được sử dụng trong tiêu chí nối khi kết hợp dữ liệu từ các bảng có liên quan trong truy vấn bằng cách khớp các cột liên quan đến ràng buộc. Các chỉ mục giúp cơ sở dữ liệu tìm thấy dữ liệu liên quan trong một bảng nước ngoài.
- Nếu bạn thay đổi các ràng buộc khóa chính, chúng sẽ được kiểm tra với các ràng buộc khóa ngoài trong các bảng liên quan.
Việc tạo chỉ mục là không bắt buộc. Bạn vẫn có thể nối dữ liệu từ hai bảng mà không cần chỉ định ràng buộc khóa chính và khóa ngoại. Tuy nhiên, việc thêm các ràng buộc khóa ngoại sẽ tối ưu hóa các bảng và kết hợp chúng trong một truy vấn đáp ứng tiêu chí sử dụng khóa. Nếu bạn thay đổi các ràng buộc khóa chính, chúng sẽ được kiểm tra với các ràng buộc nước ngoài trong các ràng buộc liên quan.
Mẹo tạo ràng buộc khóa ngoại trong SQL
Bạn đã dành rất nhiều thời gian để suy đoán; anh ấy đã trả lời tại sao. Hãy chuyển trọng tâm của chúng ta và thu hẹp nó vào các chiến thuật tạo ràng buộc khóa ngoại; trả lời thế nào.
Trường “Khóa ngoại” trong bảng đề cập đến “Khóa chính” của bảng khác. Bảng có khóa chính là bảng cha của bạn. Và bảng khóa ngoại được gọi là bảng con. Hãy đi sâu vào.
Tạo khóa ngoại khi tạo bảng
Khi tạo bảng, bạn cũng có thể tạo ràng buộc khóa ngoại để duy trì tính toàn vẹn tham chiếu. Đây là cách thực hiện:
CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, FOREIGN KEY (customer_id) REFERENCES customers(customer_id) );
Đoạn mã trên tạo một bảng có tên là “orders” với khóa số nguyên chính là “order_id”, một số nguyên khác là “customer_id” và ngày “order_date”. Trong trường hợp này, ràng buộc FOREIGN KEY được thêm vào cột “client_id” và đề cập đến “client_id” trong bảng “customers”.
Tạo khóa ngoại sau khi tạo bảng
Giả sử bạn đã tạo một bảng và muốn thêm ràng buộc khóa ngoại; sử dụng câu lệnh `ALTER TABLE` trong mã của bạn. Xem đoạn mã dưới đây.
ALTER TABLE orders ADD FOREIGN KEY (customer_id) REFERENCES customers(customer_id);
Trong trường hợp này, cột “customer_id” đã được thêm ràng buộc khóa ngoại vào bảng “orders” để tham chiếu đến cột “customer_id” trong bảng “customers”.
Tạo khóa ngoại mà không kiểm tra dữ liệu hiện có
Khi bạn thêm ràng buộc khóa ngoại vào bảng, cơ sở dữ liệu sẽ tự động kiểm tra dữ liệu hiện có để đảm bảo tính nhất quán với ràng buộc. Tuy nhiên, nếu bạn biết dữ liệu nhất quán và muốn thêm ràng buộc mà không kiểm tra tính nhất quán thì đây là cách thực hiện.
ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (customer_id) REFERENCES customers(customer_id) NOT VALIDATE;
NOT VALIDATE yêu cầu cơ sở dữ liệu không xác thực dữ liệu hiện có. Trường hợp cụ thể này rất hữu ích trong các trường hợp cụ thể. Ví dụ: khi bạn có lượng dữ liệu khổng lồ và muốn hoàn tất quá trình xác thực.
Tạo khóa ngoại bằng DELETE/UPDATE
Bằng cách tạo các ràng buộc khóa ngoại, bạn có thể chỉ đạo thực hiện các hành động trong trường hợp hàng bị ảnh hưởng được cập nhật hoặc xóa. Trong trường hợp này, bạn đang sử dụng các ràng buộc toàn vẹn tham chiếu xếp tầng để chỉ ra những hành động cần thực hiện. bao gồm:
# 1. KHÔNG CÓ HÀNH ĐỘNG
Cũng như nhiều cơ sở dữ liệu khác, quy tắc “KHÔNG CÓ HÀNH ĐỘNG” là hành vi mặc định khi tạo ràng buộc khóa ngoại. Điều này có nghĩa là sẽ không có hành động nào được thực hiện khi hàng được tham chiếu bị xóa hoặc cập nhật.
Công cụ cơ sở dữ liệu đưa ra lỗi khi ràng buộc khóa ngoại bị vi phạm. Tuy nhiên, điều này không được khuyến khích vì nó có thể dẫn đến các vấn đề về tính toàn vẹn tham chiếu vì cần phải thực thi ràng buộc khóa ngoại. Đây là một ví dụ về cách thực hiện:
ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE NO ACTION ON UPDATE NO ACTION;
#2. TUYỆT VỜI
Quy tắc “CASCADE” là một tùy chọn khác cho các hành động “BẬT XÓA” và “BẬT CẬP NHẬT” khi tạo các ràng buộc khóa ngoại. Khi được nhập, điều này có nghĩa là bất cứ khi nào một hàng được cập nhật hoặc xóa trong bảng cha, các hàng được tham chiếu cũng sẽ được cập nhật hoặc xóa tương ứng. Kỹ thuật này rất hiệu quả trong việc duy trì tính toàn vẹn tham chiếu. Đây là một ví dụ:
ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE ON UPDATE CASCADE;
Hãy cẩn thận khi sử dụng quy tắc này vì nó có thể gây ra những hậu quả không mong muốn nếu không sử dụng cẩn thận. Bạn muốn tránh việc vô tình xóa quá nhiều dữ liệu hoặc tạo các tham chiếu vòng tròn. Vì vậy, chỉ sử dụng tùy chọn này khi cần thiết và cẩn thận.
Có một số quy tắc khi sử dụng CASCADE:
- Không thể chỉ định CASCADE nếu cột dấu thời gian là một phần của khóa ngoại hoặc khóa tham chiếu.
- Nếu bảng của bạn có trình kích hoạt INSTEAD OF DELETE, bạn không thể chỉ định ON DELETED CASCADE.
- Bạn không thể chỉ định ON UPDATE CASCADE nếu bảng của bạn có trình kích hoạt INSTEAD OF UPDATE.
#3. Đặt vô giá trị
Khi bạn xóa hoặc cập nhật hàng tương ứng trong bảng cha, tất cả các giá trị tạo nên khóa ngoại được đặt thành null. Quy tắc ràng buộc này yêu cầu các cột khóa ngoài phải có giá trị rỗng để thực thi và không thể chỉ định cho các bảng có trình kích hoạt INSTEAD OF UPDATE. Đây là một ví dụ về cách thực hiện điều đó.
ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE SET NULL ON UPDATE SET NULL
Trong trường hợp này, bạn đã đặt cột khóa ngoại “customer_id” trong bảng “orders” thành null nếu hàng tương ứng trong bảng “customers” bị xóa hoặc cập nhật.
#4. ĐẶT MẶC ĐỊNH
Tại đây, bạn đặt tất cả các giá trị làm khóa ngoại làm mặc định, miễn là hàng được tham chiếu trong bảng cha được cập nhật hoặc bị xóa.
Ràng buộc này được thực thi nếu tất cả các cột khóa ngoại có định nghĩa mặc định. Nếu một cột có giá trị rỗng, nó sẽ mặc định là NULL. Lưu ý rằng tùy chọn này không thể được chỉ định cho các bảng có trình kích hoạt INSTEAD OF UPDATE. Đây là một ví dụ:
ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT;
Trong trường hợp trên, bạn đã đặt “customer_id” trong bảng “orders” thành giá trị mặc định, điều này xảy ra khi hàng tương ứng trong bảng “customers” bị xóa hoặc cập nhật.
những từ cuối
Trong hướng dẫn này, bạn đã tìm hiểu về các ràng buộc khóa chính và đi sâu vào các ràng buộc khóa ngoại. Bạn cũng đã gặp một số kỹ thuật tạo ràng buộc khóa ngoại. Và mặc dù có nhiều cách để tạo ràng buộc khóa ngoại, bài đăng này đã làm sáng tỏ các phương pháp đó.
Và hy vọng bạn đã thành thạo các kỹ thuật mới; bạn không bị giới hạn trong việc kết hợp chúng. Ví dụ: các phương thức ràng buộc CASCADE, SET NULL, SET DEFAULT và NO ACTION có thể được kết hợp trong các bảng có mối quan hệ tham chiếu.
Nếu bảng của bạn gặp KHÔNG CÓ HÀNH ĐỘNG, nó sẽ quay trở lại các quy tắc ràng buộc khác. Trong các trường hợp khác, hành động XÓA có thể kích hoạt sự kết hợp của các quy tắc này và quy tắc KHÔNG HÀNH ĐỘNG sẽ chạy cuối cùng.
Sau đó kiểm tra bảng cheat SQL.