MySQL foreign_key_checks มีผลกับฐานข้อมูลทั้งหมดหรือไม่


201

เมื่อฉันรันคำสั่งนี้ใน MySQL:

SET FOREIGN_KEY_CHECKS=0;

ส่งผลกระทบต่อเอ็นจิ้นทั้งหมดหรือเป็นเพียงธุรกรรมปัจจุบันของฉัน


15
ทดสอบ: ล็อกอินเข้าสู่ mysql: แสดงตัวแปรเช่น '% FOREIGN%'; SET FOREIGN_KEY_CHECKS = 0; หลังจากนั้นเข้าสู่ mysql โดยใช้คอนโซลอื่น ฉันสามารถเห็นได้ว่าการแสดงตัวแปรเช่น '% FOREIGN%' เปิดอยู่แทนที่จะปิด
Sean Nguyen

คำตอบ:


246

มันขึ้นอยู่กับเซสชั่นเมื่อกำหนดวิธีการที่คุณทำในคำถามของคุณ

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

ตามนี้FOREIGN_KEY_CHECKSคือ "ทั้งสอง" สำหรับขอบเขต ซึ่งหมายความว่าสามารถตั้งค่าสำหรับเซสชัน:

SET FOREIGN_KEY_CHECKS=0;

หรือทั่วโลก:

SET GLOBAL FOREIGN_KEY_CHECKS=0;

98

ที่จริงแล้วมีสองforeign_key_checksตัวแปรคือตัวแปรทั่วโลกและตัวแปรท้องถิ่น (ต่อเซสชั่น) เมื่อเชื่อมต่อตัวแปรเซสชันจะเริ่มต้นเป็นค่าของตัวแปรทั่วโลก
คำสั่งSET foreign_key_checksแก้ไขตัวแปรเซสชัน
การปรับเปลี่ยนตัวแปรทั่วโลกใช้หรือ SET GLOBAL foreign_key_checksSET @@global.foreign_key_checks

ศึกษาหัวข้อคู่มือต่อไปนี้:
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
การตั้งค่า foreign_key_checks สำหรับแต่ละคำขอมีค่าใช้จ่ายสูงหรือไม่ ฉันมีสคริปต์เพื่ออัปเกรดฐานข้อมูลและฉันไม่ต้องการให้ใครอื่นสามารถแทนที่การตรวจสอบคีย์ต่างประเทศได้ตามค่าเริ่มต้นในระหว่างการอัพเกรด ดังนั้นฉันจะทำคำถามหลายล้านข้อและฉันสงสัยว่าตลาดหลักทรัพย์จะมีความสำคัญหรือไม่?
Aki

@Aki ถ้าคุณอัพเกรด DB ฉันจะบอกว่าคุณดีกว่าที่จะล็อคการเข้าถึงสำหรับคนอื่น ๆ อย่างน้อยสำหรับการเขียน มิฉะนั้นคุณสามารถคาดหวังปัญหาการเข้าถึงพร้อมกันทุกชนิด
tishma

1
คำตอบและความแตกต่างที่ยอดเยี่ยม สิ่งสำคัญคือการตระหนักถึงผลที่จะตามมาจากการทำงาน หมายความว่าคุณไม่สามารถตั้งค่า GLOBAL ได้foreign_key_checksและในเซสชันเดียวกันนั้นคาดว่าจะไม่สนใจข้อ จำกัด ของคีย์ต่างประเทศ คุณต้องตั้งค่าตัวแปรที่ไม่ใช่ส่วนกลาง
Tyler Collier

12

ดังที่ Ron อธิบายไว้มีสองตัวแปรคือระดับท้องถิ่นและระดับโลก ตัวแปรโลคัลถูกใช้เสมอและเหมือนกับโกลบอลเมื่อเชื่อมต่อ

SET FOREIGN_KEY_CHECKS=0;
SET GLOBAL FOREIGN_KEY_CHECKS=0;

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

เมื่อตั้งค่าตัวแปร GLOBAL ตัวแปรท้องถิ่นจะไม่เปลี่ยนแปลงสำหรับการเชื่อมต่อที่มีอยู่ คุณต้องเชื่อมต่อใหม่หรือตั้งค่าตัวแปรท้องถิ่นด้วย

อาจใช้งานง่าย MYSQL ไม่บังคับใช้คีย์ต่างประเทศเมื่อเปิดใช้งาน FOREIGN_KEY_CHECKS อีกครั้ง สิ่งนี้ทำให้สามารถสร้างฐานข้อมูลที่ไม่สอดคล้องกันแม้ว่าจะมีการเปิดคีย์ต่างประเทศและการตรวจสอบ

หากคุณต้องการให้คีย์ต่างประเทศของคุณสอดคล้องกันอย่างสมบูรณ์คุณจะต้องเพิ่มคีย์ขณะที่เปิดใช้งาน


1
คุณอธิบายรายละเอียดได้ไหม .... "ถ้าคุณต้องการให้กุญแจต่างประเทศของคุณมีความสอดคล้องกันอย่างสมบูรณ์คุณจะต้องเพิ่มปุ่มต่าง ๆ ในขณะที่เปิดใช้งานอยู่"
2782001

4
สมมติว่าคุณมีตารางที่มี id ผู้อ้างอิง แต่บางระเบียนที่อ้างอิงหายไป หากคุณเพิ่ม foreign key (FK) ในขณะที่ FOREIGN_KEY_CHECKS เปิดอยู่ Mysql จะแจ้งข้อผิดพลาดและปฏิเสธที่จะเพิ่ม FK เนื่องจากการอ้างอิงที่ใช้งานไม่ได้ เมื่อคุณเพิ่มคีย์ต่างประเทศในขณะที่ FOREIGN_KEY_CHECKS ปิดอยู่ mysql จะดำเนินการต่อโดยไม่มีข้อผิดพลาด แม้ว่าคุณจะเปิดใช้งานการตรวจสอบในภายหลังก็จะไม่มีข้อผิดพลาด ตอนนี้คุณมีตารางที่มีข้อมูลที่ไม่สอดคล้องกันแม้ว่าจะมี FK ดังนั้นการมีอยู่ของ FK จึงไม่รับประกันความสอดคล้องของฐานข้อมูลเว้นแต่ว่าจะถูกเพิ่มในขณะที่การตรวจสอบ FK เปิดอยู่
Bouke Versteegh

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

หากคุณไม่ได้ตั้งค่าโกลบอลเซสชันของคุณจะได้รับผลกระทบเท่านั้น


1

ฉันมีข้อผิดพลาดเดียวกันเมื่อฉันพยายามโยกย้ายฐานข้อมูล Drupal ไปยังเซิร์ฟเวอร์ apache ท้องถิ่นใหม่ (ฉันใช้ XAMPP บนเครื่อง Windows) จริงๆแล้วฉันไม่ทราบความหมายของข้อผิดพลาดนี้ แต่หลังจากลองทำตามขั้นตอนด้านล่างแล้วฉันนำเข้าฐานข้อมูลโดยไม่มีข้อผิดพลาด หวังว่านี่จะช่วยได้:

การเปลี่ยน php.ini ที่ C: \ xampp \ php \ php.ini

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

เปลี่ยน my.ini เป็น C: \ xampp \ mysql \ bin \ my.ini

max_allowed_packet = 1024M

-2

ในกรณีที่ใช้เบราว์เซอร์แบบสอบถาม Mysql SET FOREIGN_KEY_CHECKS=0;จะไม่มีผลกระทบใด ๆ ในรุ่น 1.1.20 อย่างไรก็ตามมันทำงานได้ดีบนเบราว์เซอร์แบบสอบถาม Mysql 1.2.17

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.