2012-03-18 28 views
8

Yabancı Anahtarlar'ı MySQL içinde kullanırken, kaynak değeri 0 ise (ID 0 ile hedef kaydı olmadığından) bir hata alırım. Bu nedenle, kaynak sütunu NULL olarak değiştiriyorum ve sonra çalışır. Ancak, bunun yapılması gereken doğru yol olup olmadığından emin değilim. Doğru yol mu, yoksa kaynak kimliğini NULL yerine 0 olarak ayarlayabilir miyim?Sıfır da olabilen yabancı anahtar

+0

"0" veya "NULL" ise sizin için ne fark eder? Mantıksal bir bakış açısından, '0' sadece mantıklı değil. – Jon

cevap

19

Yabancı anahtarlar kısıtlamalardır. Bu, yabancı anahtarın bulunduğu sütunun değeri herhangi bir şeye ayarlanmışsa (ve "herhangi bir şey" NULL'u içermiyorsa), bu değerin başvurulan tabloda var olması gerektiği veya MySQL'in bir hata atacağı anlamına gelir.

Yani, kısacası, ya yabancı anahtar kısıtlamasını kaldırmak ve 0 dahil ne arzu değerini ayarlamak veya başvurulan tablodaki bir 0 ile bir kayıt eklemek NULL değer ayarlayabilirsiniz. NULL'a ayarlanan bu seçeneklerden en temiz görünüyor.

3

Evet, bu doğru yol. Bir FK'nin bütün noktası, başvurulan kimliğe sahip bir kaydın gerçekte var olmasını zorunlu kılmaktır. Yani FK sütununu 0 olarak ayarlarsanız, 0 ile bir kayıt olmalıdır.

Bunun etrafındaki tek yol, FK sütununu NULLable yapmaktır.

Herhangi bir hızda, FK sütunu neden 0 olarak ayarlamak istersiniz? SQL'de "varolmayan" için kural değeri NULL'dir.

4

Doğru yol budur. 0 bir değerdir ve null sütunda hiçbir şey olmadığını belirtir. NULL kullanmak

3

iki nedenden dolayı sıfırdan iyidir. Birincisi, "özel" bir değer olduğu açıktır (her seferinde otomatik olarak oluşturulmuş ids için doğru olsa da, tablo kimliklerini her zaman sıfır olmayan bir şeydir) ve ikincisi SQL'de yabancı anahtar kısıtlaması ile çalışır.

, yaptığınız şey genel bir uygulamadır - pek çok kişi NULL'u "eksik değer" yazan bir işaretçi olarak kullanır ve SQL'in yabancı anahtar kısıtlaması beklenir.

Eksik değerleri ele almanın başka bir yolu, yalnızca iki sınıf arasında bir bağlantı varsa (çoktan çoğa ilişkide yaptığınız gibi) bir girişe sahip üçüncü bir "bağlantı" tablosu kullanmaktır. Bu bir NULL ihtiyacını ortadan kaldırır ve bazı veritabanı geliştiricileri tarafından tercih edilir, ancak her şeyi daha karmaşık hale getirir. Daha fazla tartışma için bkz. Nullable Foreign Key bad practice?.