Kiểm tra khóa ngoại trong MySQL có thể ngăn bạn thực hiện một số cập nhật cơ sở dữ liệu cho các bảng có ràng buộc khóa ngoại. Trong những trường hợp như vậy, bạn có thể tạm thời tắt tính năng kiểm tra khóa ngoại trong MySQL, thực hiện cập nhật và bật tính năng kiểm tra khóa ngoại trong MySQL sau đó. Đây là cách vô hiệu hóa ràng buộc khóa ngoại trong MySQL
Cách vô hiệu hóa kiểm tra khóa ngoại trong MySQL
Dưới đây là các bước để vô hiệu hóa kiểm tra khóa ngoại trong MySQL
Bạn có thể tắt kiểm tra khóa ngoại trong MySQL bằng cách đặt biến hệ thống Foreign_key_checks thành 0
SET foreign_key_checks = 0
Tương tự, bạn có thể kích hoạt kiểm tra khóa ngoại trong MySQL bằng cách đặt biến hệ thống Foreign_key_check thành 1
SET foreign_key_checks = 1
Tuy nhiên, xin lưu ý, sau khi bạn bật kiểm tra khóa ngoại, MySQL sẽ không xác thực lại dữ liệu hiện có mà bạn đã thêm sau khi tắt kiểm tra khóa ngoại. Nó sẽ chỉ kiểm tra bất kỳ bổ sung/cập nhật mới nào đối với cơ sở dữ liệu của bạn
Phần thưởng đọc. Cách tạo chuỗi trong MySQL
Chúng ta hãy xem xét một ví dụ. Giả sử bạn có hai bảng quốc gia và thành phố sau đây sao cho các thành phố có cột khóa ngoại country_id đề cập đến country_id ở các quốc gia
CREATE TABLE countries[ country_id INT PRIMARY KEY AUTO_INCREMENT, country_name VARCHAR[255] NOT NULL ];
CREATE TABLE cities[ city_id INT PRIMARY KEY AUTO_INCREMENT, city_name VARCHAR[255], country_id INT, FOREIGN KEY[country_id] REFERENCES countries[country_id] ];
Phần thưởng đọc. Cách so sánh hai bảng trong MySQL
Bây giờ, hãy thử chèn một hàng vào bảng thành phố mà không đề cập đến giá trị khóa ngoại country_id và bạn sẽ gặp lỗi như hình bên dưới
Đôi khi, rất hữu ích khi tắt kiểm tra khóa ngoại. Ví dụ: bạn có thể tải dữ liệu vào bảng cha và bảng con theo bất kỳ thứ tự nào khi tắt chức năng kiểm tra ràng buộc khóa ngoài. Nếu bạn không tắt kiểm tra khóa ngoại, trước tiên bạn phải tải dữ liệu vào bảng cha và sau đó là bảng con, điều này có thể rất tẻ nhạt
Một tình huống khác mà bạn muốn tắt tính năng kiểm tra khóa ngoại là khi bạn muốn xóa một bảng. Trừ khi bạn vô hiệu hóa kiểm tra khóa ngoại, bạn không thể xóa bảng được tham chiếu bởi ràng buộc khóa ngoại
Để tắt kiểm tra khóa ngoại, bạn đặt biến
6 thành 0 như sauCode language: SQL [Structured Query Language] [sql]
SET foreign_key_checks = 1;
Code language: SQL [Structured Query Language] [sql]
SET foreign_key_checks = 0;
Để kích hoạt lại kiểm tra ràng buộc khóa ngoại, bạn đặt giá trị của
6 thành 1Code language: SQL [Structured Query Language] [sql]
SET foreign_key_checks = 1;
Code language: SQL [Structured Query Language] [sql]
SET foreign_key_checks = 1;
Lưu ý rằng cài đặt
6 thành 1 không kích hoạt bất kỳ xác thực nào đối với dữ liệu bảng hiện có. Nói cách khác, MySQL sẽ không xác minh tính nhất quán của dữ liệu đã được thêm vào trong quá trình kiểm tra khóa ngoại.Code language: SQL [Structured Query Language] [sql]
SET foreign_key_checks = 1;
Vô hiệu hóa ví dụ kiểm tra khóa ngoại
Đầu tiên, tạo một bảng mới tên là
9Code language: SQL [Structured Query Language] [sql]
SET foreign_key_checks = 1;
SET foreign_key_checks = 10
Thứ hai, tạo một bảng khác có tên là
SET foreign_key_checks = 100
SET foreign_key_checks = 12
Bảng
SET foreign_key_checks = 100 có ràng buộc khóa ngoại đề cập đến cột
SET foreign_key_checks = 102 của bảng
9Code language: SQL [Structured Query Language] [sql]
SET foreign_key_checks = 1;
Thứ ba, chèn một hàng mới vào bảng
SET foreign_key_checks = 100
SET foreign_key_checks = 17
MySQL đã đưa ra lỗi sau
SET foreign_key_checks = 18
Thứ tư, vô hiệu hóa kiểm tra khóa ngoại
Code language: SQL [Structured Query Language] [sql]
SET foreign_key_checks = 0;
Thứ năm, chèn một hàng mới vào bảng
SET foreign_key_checks = 100
SET foreign_key_checks = 17
Lần này, câu lệnh
SET foreign_key_checks = 106 được thực thi thành công do tính năng kiểm tra khóa ngoại bị vô hiệu hóa
Truy vấn sau đây trả về nội dung của bảng
SET foreign_key_checks = 100
CREATE TABLE countries[ country_id INT PRIMARY KEY AUTO_INCREMENT, country_name VARCHAR[255] NOT NULL ];4
Thứ sáu, kích hoạt lại kiểm tra ràng buộc khóa ngoại
Code language: SQL [Structured Query Language] [sql]
SET foreign_key_checks = 1;
Khi kiểm tra khóa ngoại được bật lại, MySQL không xác thực lại dữ liệu trong bảng. Tuy nhiên, nó sẽ không cho phép bạn chèn hoặc cập nhật dữ liệu vi phạm ràng buộc khóa ngoại
Cuối cùng, chèn một hàng vào bảng
9 có giá trị trong cột
SET foreign_key_checks = 1;
Code language: SQL [Structured Query Language] [sql]
SET foreign_key_checks = 102 là 1 để làm cho dữ liệu nhất quán trong cả hai bảng
0Code language: SQL [Structured Query Language] [sql]
SET foreign_key_checks = 1;
Bỏ bảng có ràng buộc khóa ngoài
Giả sử rằng bạn muốn loại bỏ các bảng
9 vàCode language: SQL [Structured Query Language] [sql]
SET foreign_key_checks = 1;
SET foreign_key_checks = 100
Đầu tiên, thả cái bàn xuống
9Code language: SQL [Structured Query Language] [sql]
SET foreign_key_checks = 1;
1Code language: SQL [Structured Query Language] [sql]
SET foreign_key_checks = 1;
MySQL đã đưa ra lỗi này
2Code language: SQL [Structured Query Language] [sql]
SET foreign_key_checks = 1;
Để khắc phục điều này, bạn có hai lựa chọn
- Bỏ bàn
SET foreign_key_checks = 1
00 trước rồi bỏ bàn
9
Code language: SQL [Structured Query Language] [sql]SET foreign_key_checks = 1;
- Vô hiệu hóa kiểm tra khóa ngoại và thả bảng theo bất kỳ trình tự nào
Chúng tôi sẽ trình bày cách thứ hai vô hiệu hóa kiểm tra ràng buộc khóa ngoài trước khi bỏ bảng