Ben fark ettik MATCH SIMPLE
ve MATCH FULL
ama ne yaptıklarını anlamıyorum. Varsayılanı görüyorum MATCH SIMPLE
; Ancak, diğer MATCH
hükümler FOREIGN KEY
kısıtlama fonksiyonunu nasıl kullanır?
Ben fark ettik MATCH SIMPLE
ve MATCH FULL
ama ne yaptıklarını anlamıyorum. Varsayılanı görüyorum MATCH SIMPLE
; Ancak, diğer MATCH
hükümler FOREIGN KEY
kısıtlama fonksiyonunu nasıl kullanır?
Yanıtlar:
CREATE TABLE
Kılavuzun sayfasını kontrol edin :
: Üç maç türleridir
MATCH FULL
,MATCH PARTIAL
veMATCH SIMPLE
(varsayılan olan).MATCH FULL
çok anahtarlı bir yabancı anahtarın bir sütununun, tüm yabancı anahtar sütunlar boş olmadığı sürece boş bırakılmasına izin vermez; hepsi boşsa, satırın başvurulan tabloda eşleşmesi gerekmez.MATCH SIMPLE
yabancı anahtar sütunlarından herhangi birinin boş olmasına izin verir; bunlardan herhangi biri null olursa, satırın başvurulan tabloda bir eşleşmesi olması gerekmez.MATCH PARTIAL
henüz uygulanmadı. (Tabii ki,NOT NULL
bu vakaların ortaya çıkmasını önlemek için referans sütunlara sınırlamalar uygulanabilir.)
Ayrıca, Yabancı Anahtarlar bölümünde :
Normal olarak, bir referans satırının, referans sütunlarından herhangi birinin boş olması durumunda yabancı anahtar kısıtlamasını sağlaması gerekmez. Eğer
MATCH FULL
yabancı anahtar beyanı eklenir, bir referans satır (boş ve boş olmayan değerlerin bir karışımı bir başarısızlığa garanti böylece tüm referans sütunları boş yalnızca koşulunu karşılayan kaçarMATCH FULL
kısıtlamayı). Referans satırlarına yabancı anahtar kısıtlamasını yerine getirmekten kaçınmak istemiyorsanız, referans sütun (lar) ını ilan edinNOT NULL
.
Ve mevcut kılavuza veya kurulumunuza uygun olan versiyona bakın. Eski sürümlere giden eski Google bağlantılarına düşmeyin.
FULL
vs SIMPLE
vsPARTIAL
Seçilen cevap doğru olsa da, eğer bu sizin için yeniyse, kodla görmek isteyebilirsiniz - bence bu şekilde anlaşmak daha kolay.
-- one row with (1,1)
CREATE TABLE foo ( a int, b int,
PRIMARY KEY (a,b)
);
INSERT INTO foo (a,b) VALUES (1,1);
--
-- two child tables to reference it
--
CREATE TABLE t_full ( a int, b int,
FOREIGN KEY (a,b) REFERENCES foo MATCH FULL
);
CREATE TABLE t_simple ( a int, b int,
FOREIGN KEY (a,b) REFERENCES foo MATCH SIMPLE
);
Mantıksal olarak FULL
ve ile SIMPLE
tam bir eşleşme ekleyebiliriz.
-- works
INSERT INTO t_full (a,b) VALUES (1,1);
INSERT INTO t_simple (a,b) VALUES (1,1);
Sorun, sütunlardan biri olduğunda ortaya çıkar NULL
.
-- works
INSERT INTO t_simple (a,b) VALUES (1,NULL);
-- fails
INSERT INTO t_full (a,b) VALUES (1,NULL);
İçine eklemek t_full
aşağıdaki hatayı oluşturur,
ERROR: insert or update on table "t_full" violates foreign key constraint "t_full_a_fkey"
DETAIL: MATCH FULL does not allow mixing of null and nonnull key values.
INSERT 0 1
Tamam, yani ne hakkında (42,NULL)
- bu hep yaklaşık kafa karıştırıcı bulduğu parçasıdır MATCH SIMPLE
,
-- works
INSERT INTO t_simple (a,b) VALUES (42,NULL);
Yukarıdaki davranış olur DEĞİL iş uygulanmayan ile MATCH PARTIAL
olasılıkla en sağdaki sütun olan bir bileşik endeksi için istediğimizi yapar, hangi NULL
dışarı ed. Ancak bazı insanlar bunu Pandora'nın kutusunu kötü tasarıma açma yöntemi olarak görüyorlar.
MATCH FULL
her şey tam olarak eşleşmeli veya tüm sütunlarNULL
MATCH SIMPLE
eğer bir şey NULL
kısıtlama ise basitçe göz ardı edilir.MATCH PARTIAL
tek şey ise NULL
her şeyin olması NULL
edilir kısmen kısıtlama amacıyla mantıklı bir şey yaparak kurtarılabilir.Posterity için, burada SQL Spec tanımları <match type>
MATCH SIMPLE
en az bir referans sütunu null ise, referans tablosunun satırı sınır kontrolünden geçer. Tüm referans veren sütunlar boş değilse, satır kısıtlama kontrolünü geçer ve sadece başvurulan tablonun tüm referans sütunlarıyla eşleşen bir satır olup olmadığını kontrol eder.MATCH PARTIAL
: tüm referans sütunları boşsa, referans tablosunun satırı sınır kontrolünden geçer. En az bir referans sütunu boş değilse, satır, kısıtlama kontrolünü ancak sadece referans olmayan tablonun tüm boş olmayan referans sütunları ile eşleşen bir satır olup olmadığını kontrolünden geçirir.MATCH FULL
: tüm referans sütunları boşsa, referans tablosunun satırı sınır kontrolünden geçer. Tüm referans veren sütunlar boş değilse, satır kısıtlama kontrolünü geçer ve sadece başvurulan tablonun tüm referans sütunlarıyla eşleşen bir satır olup olmadığını kontrol eder. Bazı referans sütunları boşsa ve başka bir referans sütunu boş değilse, referans tablosunun satırı kısıtlama denetimini ihlal eder.
Bu PostgreSQL'e özgü olmasa da, bu örnekler PostgreSQL ile gösterilmektedir.