Tin tức và phân tích của tất cả các thiết bị di động

Cách tạo ràng buộc khóa ngoại trong SQL

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:

  • Bảng chỉ chứa một ràng buộc khóa chính.
  • Khóa chính không được vượt quá 16 cột và độ dài tối đa 900 ký tự.
  • Các chỉ mục được tạo bởi khóa chính có thể tăng chỉ mục trên một bảng. Tuy nhiên, số lượng chỉ mục được nhóm trên bảng không thể vượt quá 1và số lượng chỉ mục không được nhóm trên bảng được giới hạn ở 999.
  • Khi phân cụm và không phân cụm không được chỉ định cho một ràng buộc khóa, thì phân cụm sẽ được giả định tự động.
  • Tất cả các cột được khai báo trong ràng buộc khóa chính phải được xác định là không rỗng. Nếu không, tất cả các cột được nối trong ràng buộc sẽ tự động được đặt thành giá trị rỗng thành giá trị khác 0.
  • Khi các khóa chính được xác định trong loại cột do người dùng xác định trong thời gian chạy ngôn ngữ chung (CLR), việc triển khai loại đó phải hỗ trợ thứ tự nhị phân.
  • 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ế:

  • Tham chiếu khóa ngoài lớn hơn 253 chỉ khả dụng cho các hoạt động XÓA DML. MERGE và UPDATE không được hỗ trợ.
  • Các bảng có tham chiếu khóa ngoại có tối đa 253 tham chiếu khóa ngoại.
  • Đối với các chỉ mục của kho lưu trữ cột, các bảng được tối ưu hóa bộ nhớ và các bảng khóa ngoại được phân vùng, các tham chiếu khóa ngoại được giới hạn ở 253.
  • Ư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.

  • Tính toàn vẹn tham chiếu – Ràng buộc khóa ngoài đảm bảo rằng mọi bản ghi trong bảng phụ đều khớp với bản ghi trong bảng chính, đảm bảo tính nhất quán của dữ liệu trong cả hai bảng.
  • Ngăn chặn các bản ghi mồ côi – Nếu bạn xóa bảng cha, các ràng buộc khóa ngoại đảm bảo rằng bảng con liên quan cũng bị xóa, ngăn chặn các bản ghi mồ côi xảy ra có thể dẫn đến sự không nhất quán về dữ liệu.
  • Cải thiện hiệu suất – Ràng buộc khóa ngoài cải thiện hiệu suất truy vấn bằng cách cho phép hệ thống quản lý cơ sở dữ liệu tối ưu hóa các truy vấn dựa trên mối quan hệ bảng.
  • 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.