2011-12-16 7 views
151

Ben MySQL Bu komutu uyguladığınızda?MySQL foreign_key_checks tüm veritabanını etkiler mi? <pre><code>SET FOREIGN_KEY_CHECKS=0; </code></pre> <p></p> bu bütün motoru etkiler mi yoksa sadece benim şimdiki işlemdir:

+13

sınama: mysql dosyasına giriş yap: '% FOREIGN%' gibi değişkenleri göster; SET FOREIGN_KEY_CHECKS = 0; Bundan sonra farklı bir konsol kullanarak mysql içine giriş yapın. '% FOREIGN%' gibi şov değişkenlerinin OFF yerine AÇIK olduğunu görebiliyorum. –

cevap

92

Aslında, iki foreign_key_checks değişken vardır: global değişken ve bir yerel (dönem başına) değişken. Bağlantı üzerine, oturum değişkeni global değişkenin değerine başlatılır.
SET foreign_key_checks komutu, oturum değişkenini değiştirir.
, küresel değişkeni değiştirmek SET GLOBAL foreign_key_checks veya SET @@global.foreign_key_checks kullanın.

aşağıdaki manuel bölümleri Consult: http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

+1

Her istek için foreign_key_checks ayarlanıyor mu? DB'yi yükseltmek için bir komut dosyası var ve bu yükseltme sırasında varsayılan olarak yabancı anahtar denetimlerini geçersiz kılabilmek istemiyorum. Öyleyse milyonlarca sorgu yapardım ve bir SET'in anlamlı olup olmayacağını merak ettim? – Aki

+0

@Aki DB'yi yükseltiyorsanız, herkes için erişimi kilitlemenin daha iyi olduğunu söyleyebilirim. En azından yazı için. Aksi takdirde, her türlü eşzamanlı erişim sorununu bekleyebilirsiniz. – tishma

+0

Harika cevap ve ayrım. Nasıl çalıştığının sonuçlarını anlamak önemlidir. Bu, GLOBAL 'foreign_key_checks 'ayarlayamayacağınız anlamına gelir ve aynı oturumda yabancı anahtar kısıtlamalarını görmezden gelmesini bekler. Küresel olmayan değişkeni ayarlamanız gerekir. –

-1

, SET FOREIGN_KEY_CHECKS=0; sürümü 1.1.20 herhangi bir etkisi yoktur. Ancak, MySQL sorgu tarayıcısı Ron tarafından açıklandığı üzere 1.2.17

9

üzerinde çalışıyor, yerel ve küresel iki değişken vardır. Yerel değişken her zaman kullanılır ve bağlantı üzerinden 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 

KÜRESEL değişken ayarlama

, yerel bir varolan herhangi bağlantıları için değiştirilmedi. Yerel değişkeni de yeniden bağlamanız veya ayarlamanız gerekir. FOREIGN_KEY_CHECKS yeniden etkin olduğunda

Belki unintuitive, MYSQL yabancı anahtarları zorlamaz. Bu, yabancı anahtarlar ve kontroller açık olsa bile tutarsız bir veritabanı oluşturmayı mümkün kılar. Eğer yabancı anahtarları tamamen tutarlı olmasını istiyorsanız

, sen kontrol açıkken tuşları eklemeniz gerekir.

+1

Detayı düzeltebilir misiniz? "Yabancı anahtarlarınızın tamamen tutarlı olmasını istiyorsanız, kontrol açıkken anahtarları eklemeniz gerekir." – user2782001

+3

Diyelim ki, başvuru kimliğine sahip bir tablonuz var, ancak bazı referans kayıtları eksik. FOREIGN_KEY_CHECKS AÇIK iken yabancı anahtarı (FK) eklerseniz, Mysql bir hata verecek ve kırık referans nedeniyle FK'yi eklemeyi reddedecektir. FOREIGN_KEY_CHECKS KAPALI iken yabancı anahtarı eklediğinizde, mysql hatasız devam eder. Daha sonra kontrolleri etkinleştirdiğinizde bile, herhangi bir hata olmayacaktır. Artık bir FK olsa da, tutarsız veriler içeren bir tablonuz var. Böylelikle, FK kontrolleri yapılırken eklenmediği sürece FK'nin varlığı, veritabanı tutarlılığının garantisi değildir. –

İlgili konular