MySQL foreign_key_checks tüm veritabanını etkiler mi?


201

MySQL'de bu komutu yürüttüğümde:

SET FOREIGN_KEY_CHECKS=0;

Tüm motoru etkiler mi, yoksa sadece mevcut işlemim mi?


15
test: mysql'de oturum açın: '% FOREIGN%' gibi değişkenleri göster; SET FOREIGN_KEY_CHECKS = 0; Bundan sonra farklı bir konsol kullanarak mysql'de oturum açın. '% FOREIGN%' gibi değişkenlerin OFF yerine ON olduğunu görebiliyorum.
Sean Nguyen

Yanıtlar:



98

Aslında iki foreign_key_checksdeğişken vardır: bir global değişken ve bir yerel (oturum başına) değişken. Bağlantı üzerine, oturum değişkeni genel değişkenin değerine ilklendirilir.
Komut SET foreign_key_checks, oturum değişkenini değiştirir.
Genel değişkeni değiştirmek için SET GLOBAL foreign_key_checksveya tuşunu kullanın SET @@global.foreign_key_checks.

Aşağıdaki manuel bölümlere bakın:
http://dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
http://dev.mysql.com/doc/refman/5.7/en/server -sistem-variables.html


1
Her istek için foreign_key_checks ayarının yapılması maliyetli midir? Ben DB yükseltmek için bir komut var ve ben başkasının bu yükseltme sırasında varsayılan olarak yabancı anahtar denetimlerini geçersiz kılmak istemem. Milyonlarca sorgu yaparım ve bir SET'in önemli olup olmayacağını merak ettim?
Aki

@Aki DB yükseltme yapıyorsanız, herkes için erişim kilitleme daha iyi olduğunu söyleyebilirim. En azından yazmak için. Aksi takdirde, her türlü eşzamanlı erişim sorunu bekleyebilirsiniz.
tishma

1
Harika cevap ve ayrım. Nasıl çalıştığının sonuçlarını anlamak önemlidir. GLOBAL'i ayarlayamayacağınız anlamına gelir foreign_key_checksve aynı oturumda yabancı anahtar kısıtlamalarını yok saymasını bekler. Global olmayan değişkeni ayarlamanız gerekir.
Tyler Collier

12

Ron tarafından açıklandığı gibi, yerel ve küresel olmak üzere iki değişken vardır. Yerel değişken her zaman kullanılır ve bağlantı üzerine global ile aynıdır.

SET FOREIGN_KEY_CHECKS=0;
SET GLOBAL FOREIGN_KEY_CHECKS=0;

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

GLOBAL değişkenini ayarlarken, mevcut bağlantı için yerel değişken değişmez. Yerel değişkeni de yeniden bağlamanız veya ayarlamanız gerekir.

Belki de sezgisel olmayan, FORSIGN_KEY_CHECKS yeniden etkinleştirildiğinde MYSQL yabancı anahtarları zorlamıyor. Bu, yabancı anahtarlar ve denetimler açık olsa bile tutarsız bir veritabanı oluşturmayı mümkün kılar.

Yabancı anahtarlarınızın tamamen tutarlı olmasını istiyorsanız, denetleme açıkken anahtarları eklemeniz gerekir.


1
"Yabancı anahtarlarınızın tamamen tutarlı olmasını istiyorsanız, denetleme açıkken anahtarları eklemeniz gerekir."
user2782001

4
Diyelim ki referans kimliğine sahip bir tablonuz var, ancak referans verilen bazı kayıtlar eksik. FOREIGN_KEY_CHECKS açıkken yabancı anahtarı (FK) eklerseniz, Mysql hatalı bir referans nedeniyle bir hata oluşturur ve FK eklemeyi reddeder. FOREIGN_KEY_CHECKS KAPALI durumdayken yabancı anahtar eklediğinizde, mysql hatasız devam eder. Daha sonra kontrolleri etkinleştirseniz bile hata olmaz. Artık bir FK olmasına rağmen tutarsız veriler içeren bir tablonuz var. Bu nedenle, FK denetimleri açıkken eklenmedikçe, bir FK'nin varlığı veritabanı tutarlılığının garantisi değildir.
Bouke Versteegh

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

GLOBAL'ı ayarlamadıysanız, yalnızca oturumunuz etkilenmiştir.


1

Drupal veritabanını yeni bir yerel apache sunucusuna geçirmeye çalıştığımda aynı hatayla karşılaştım (Windows makinesinde XAMPP kullanıyorum). Aslında bu hatanın anlamını bilmiyorum, ancak aşağıdaki adımları denedikten sonra veritabanını hatasız olarak içe aktardım. Umarım bu yardımcı olabilir:

C: \ xampp \ php \ php.ini konumundaki php.ini dosyasını değiştirme

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

C: \ xampp \ mysql \ bin \ my.ini dizinindeki my.ini dosyasını değiştirme

max_allowed_packet = 1024M

-2

Mysql sorgu tarayıcısının kullanılması durumunda, SET FOREIGN_KEY_CHECKS=0;1.1.20 sürümünde herhangi bir etkisi yoktur. Ancak, Mysql sorgu tarayıcı 1.2.17 iyi çalışıyor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.