MATCH FULL, MATCH BASİT ve MATCH PARTIAL arasındaki farklar?


Yanıtlar:


38

CREATE TABLEKılavuzun sayfasını kontrol edin :

: Üç maç türleridir MATCH FULL, MATCH PARTIALve MATCH 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 SIMPLEyabancı 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 PARTIALhenüz uygulanmadı. (Tabii ki, NOT NULLbu 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çar MATCH 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 edin NOT 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.


7

FULLvs SIMPLEvsPARTIAL

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 FULLve ile SIMPLEtam 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_fullaş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 PARTIALolasılıkla en sağdaki sütun olan bir bileşik endeksi için istediğimizi yapar, hangi NULLdışarı ed. Ancak bazı insanlar bunu Pandora'nın kutusunu kötü tasarıma açma yöntemi olarak görüyorlar.

Basit Tanımlar ve Anımsatıcılar

  • MATCH FULLher şey tam olarak eşleşmeli veya tüm sütunlarNULL
  • MATCH SIMPLEeğer bir şey NULLkısıtlama ise basitçe göz ardı edilir.
  • MATCH PARTIALtek şey ise NULLher şeyin olması NULLedilir kısmen kısıtlama amacıyla mantıklı bir şey yaparak kurtarılabilir.

SQL Özel Notlar

Posterity için, burada SQL Spec tanımları <match type>

  • MATCH SIMPLEen 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.

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.