MySQL Foreign_key_checks có ảnh hưởng đến toàn bộ cơ sở dữ liệu không?


201

Khi tôi thực thi lệnh này trong MySQL:

SET FOREIGN_KEY_CHECKS=0;

Nó có ảnh hưởng đến toàn bộ động cơ hay chỉ là giao dịch hiện tại của tôi?


15
kiểm tra: đăng nhập vào mysql: hiển thị các biến như '% FOREIGN%'; SET FOREIGN_KEY_CHECKS = 0; Sau đó đăng nhập vào mysql bằng một giao diện điều khiển khác. Tôi có thể thấy rằng hiển thị các biến như '% FOREIGN%' là BẬT thay vì TẮT.
Sean Nguyễn

Câu trả lời:



98

Trên thực tế, có hai foreign_key_checksbiến: biến toàn cục và biến cục bộ (mỗi phiên). Khi kết nối, biến phiên được khởi tạo thành giá trị của biến toàn cục.
Lệnh SET foreign_key_checkssửa đổi biến phiên.
Để sửa đổi biến toàn cục, sử dụng SET GLOBAL foreign_key_checkshoặc SET @@global.foreign_key_checks.

Tham khảo các phần hướng dẫn sau:
http://dev.mysql.com/doc/refman/5.7/en/USE-system-variables.html
http://dev.mysql.com/doc/refman/5.7/en/server -system-biến.html


1
Việc thiết lập Foreign_key_checks cho mỗi yêu cầu có tốn kém không? Tôi đã có một tập lệnh để nâng cấp DB và tôi sẽ không muốn bất kỳ ai khác có thể ghi đè kiểm tra khóa ngoại theo mặc định trong quá trình nâng cấp đó. Vì vậy, tôi đã thực hiện hàng triệu truy vấn và tôi tự hỏi liệu một SET có đáng kể hay không?
Aki

@Aki Nếu bạn đang nâng cấp DB, tôi muốn nói rằng bạn nên khóa truy cập cho những người khác. Ít nhất là để viết. Nếu không, bạn có thể mong đợi tất cả các loại vấn đề truy cập đồng thời.
tishma

1
Câu trả lời tuyệt vời và sự khác biệt. Điều quan trọng là nhận ra hậu quả của cách nó hoạt động. Điều đó có nghĩa là bạn không thể thiết lập TOÀN CẦU foreign_key_checksvà trong cùng một phiên, hy vọng nó sẽ bỏ qua các ràng buộc khóa ngoại. Bạn cần đặt biến không toàn cầu.
Tyler Collier

12

Theo giải thích của Ron, có hai biến số, cục bộ và toàn cầu. Biến cục bộ luôn được sử dụng và giống như toàn cục khi kết nối.

SET FOREIGN_KEY_CHECKS=0;
SET GLOBAL FOREIGN_KEY_CHECKS=0;

SHOW Variables WHERE Variable_name='foreign_key_checks'; # always shows local variable

Khi đặt biến GLOBAL, biến cục bộ không thay đổi đối với mọi kết nối hiện có. Bạn cần kết nối lại hoặc đặt biến cục bộ.

Có lẽ không trực quan, MYSQL không thực thi khóa ngoại khi FOREIGN_KEY_CHECKS được bật lại. Điều này cho phép tạo một cơ sở dữ liệu không nhất quán mặc dù các khóa và kiểm tra nước ngoài được bật.

Nếu bạn muốn các khóa ngoại của bạn hoàn toàn nhất quán, bạn cần thêm các khóa trong khi kiểm tra được bật.


1
Bạn có thể giải thích về .... "Nếu bạn muốn các khóa ngoại của bạn hoàn toàn nhất quán, bạn cần thêm các khóa trong khi kiểm tra được bật."
dùng2782001

4
Giả sử bạn có một bảng có id tham chiếu, nhưng một số bản ghi được tham chiếu bị thiếu. Nếu bạn thêm khóa ngoại (FK) trong khi FOREIGN_KEY_CHECKS đang BẬT, thì Mysql sẽ phát sinh lỗi và từ chối thêm FK, vì tham chiếu bị hỏng. Khi bạn thêm khóa ngoại trong khi FOREIGN_KEY_CHECKS bị TẮT, mysql tiếp tục không có lỗi. Ngay cả khi bạn kích hoạt kiểm tra sau đó, sẽ không có lỗi. Bây giờ bạn có một bảng với dữ liệu không nhất quán, mặc dù có FK. Như vậy, sự tồn tại của FK không đảm bảo tính nhất quán của cơ sở dữ liệu, trừ khi nó được thêm vào trong khi kiểm tra FK được bật.
Bouke Versteegh

10
# will get you the current local (session based) state.
SHOW Variables WHERE Variable_name='foreign_key_checks';

Nếu bạn không THIẾT LẬP TOÀN CẦU, chỉ phiên của bạn bị ảnh hưởng.


1

Tôi đã gặp lỗi tương tự khi tôi cố gắng di chuyển cơ sở dữ liệu Drupal sang máy chủ apache cục bộ mới (tôi đang sử dụng XAMPP trên máy Windows). Thật ra tôi không biết ý nghĩa của lỗi này, nhưng sau khi thử các bước bên dưới, tôi đã nhập cơ sở dữ liệu mà không gặp lỗi. Hy vọng điều này có thể giúp:

Thay đổi php.ini tại C: \ xampp \ php \ php.ini

max_execution_time = 600
max_input_time = 600
memory_limit = 1024M
post_max_size = 1024M

Thay đổi my.ini tại C: \ xampp \ mysql \ bin \ my.ini

max_allowed_packet = 1024M

-2

Trong trường hợp sử dụng trình duyệt truy vấn Mysql, SET FOREIGN_KEY_CHECKS=0;không có bất kỳ tác động nào trong phiên bản 1.1.20. Tuy nhiên, nó hoạt động tốt trên trình duyệt truy vấn Mysql 1.2.17

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.