2011-12-16 27 views
151

Khi tôi thực hiện lệnh này trong MySQL:MySQL external_key_checks có ảnh hưởng đến toàn bộ cơ sở dữ liệu không?

SET FOREIGN_KEY_CHECKS=0; 

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

+13

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 cách sử dụng một giao diện điều khiển khác nhau. Tôi có thể thấy rằng các biến hiển thị như '% FOREIGN%' là BẬT thay vì TẮT. –

Trả lời

169

Đó là dựa trên phiên, khi đặt cách bạn đã làm trong câu hỏi của mình.

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

Theo đó, FOREIGN_KEY_CHECKS là "Cả hai" cho phạm vi. Điều này có nghĩa nó có thể được thiết lập cho phiên:

SET FOREIGN_KEY_CHECKS=0;

hoặc trên toàn cầu:

SET GLOBAL FOREIGN_KEY_CHECKS=0;

92

Trên thực tế, có hai foreign_key_checks biến: một biến toàn cầu và một biến địa phương (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ầu.
Lệnh SET foreign_key_checks sửa đổi biến phiên.
Để sửa đổi biến toàn cục, hãy sử dụng SET GLOBAL foreign_key_checks hoặc SET @@global.foreign_key_checks.

Tham khảo ý kiến ​​các bộ phận của nhãn hiệu sau:
http://dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

+1

Có đặt giá trị ngoại lệ cho mỗi yêu cầu không? Tôi đã có một kịch bản để nâng cấp DB và tôi sẽ không muốn bất cứ ai khác để có thể ghi đè các kiểm tra khóa nước ngoài theo mặc định trong quá trình nâng cấp đó. Vì vậy, tôi muốn làm cho hàng triệu truy vấn và tôi tự hỏi nếu một SET sẽ có ý nghĩa hay không? – Aki

+0

@Aki Nếu bạn đang nâng cấp DB, tôi muốn nói rằng bạn nên tắt quyền truy cập khóa cho mọi 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

+0

Câu trả lời và phân biệt tuyệt vời. Điều quan trọng là phải nhận ra hậu quả của nó hoạt động như thế nào. Nó có nghĩa là bạn không thể đặt GLOBAL 'foreign_key_checks' và trong cùng một phiên làm việc mong đợi nó bỏ qua các ràng buộc khóa ngoài. Bạn cần đặt biến không phải toàn cầu. –

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

Nếu bạn không đặt toàn cầu, chỉ có phiên của bạn bị ảnh hưởng.

-1

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

9

Theo giải thích của Ron, có hai biến, cục bộ và toàn cục. 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 cho bất kỳ kết nối hiện có nào. Bạn cần phải 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 các khóa ngoại khi FOREIGN_KEY_CHECKS được bật lại. Điều này làm cho nó có thể tạo ra một cơ sở dữ liệu không phù hợp mặc dù các phím nước ngoài và kiểm tra được trên.

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

+1

Bạn có thể xây dựng trên .... "Nếu bạn muốn các phím nước ngoài của bạn hoàn toàn nhất quán, bạn cần phải thêm các phím trong khi kiểm tra là trên." – user2782001

+3

Giả sử bạn có bảng có tham chiếu id, 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ẽ tăng 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 đang TẮT, mysql tiếp tục không có lỗi. Ngay cả khi bạn bậ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ó một 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. –

Các vấn đề liên quan