İki sütunun aynı değere sahip olmadığından emin olabilir miyim


11

Eğer buna benzeyen bir masam varsa

CREATE TABLE foo (
   id INT NOT NULL AUTO_INCREMENT,
   aa INT NOT NULL,
   bb INT NOT NULL,
   PRIMARY KEY (id),
   UNIQUE KEY (aa, bb),
   CONSTRAINT aa_ref FOREIGN KEY (aa) REFERENCES bar (id),
   CONSTRAINT bb_ref FOREIGN KEY (bb) REFERENCES bar (id)
)

aa != bbUygulama düzeyinde mantık kullanmanın veya bir tetikleyiciyi INSERT ÖNCE başarısız olmaya zorlamanın yanında bir yol var mı ?

Yanıtlar:


3

MySQL CHECKdoğrudan bağlantıları desteklemez , ancak yeterince yeni bir sürüme sahipseniz tetikleyicileri ve hata yükseltmeyi destekler SIGNAL, böylece amaçlanan kısıtlama karşılanmadığında verileri kontrol eden ve hataları yükselten tanımlayabilir BEFORE INSERTve BEFORE UPDATEtetikleyebilirsiniz.

Bu, elbette kontrol kısıtlamaları için yerel destekten daha az verimli olacaktır, bu nedenle bu yapıya yüksek miktarda yazma gerçekleştiriyorsanız, uygulamanıza çok fazla zarar vermesi durumunda tetikleyicinin neden olduğu performans farkını analiz ettiğinizden emin olun.


9

Hayır, yapamazsınız. Çoğu DBMS'de (Postgres, SQL-Server, Oracle, DB2 ve diğerleri) bir CHECKkısıtlama ekleyebilirsiniz :

ALTER TABLE foo 
  ADD CONSTRAINT aa_cannot_be_equal_to_bb_CHK
    CHECK (aa <> bb) ;

Ben sadece referans kısıtlamaları kullanarak, MySQL bunu elde etmek için herhangi bir yol görmüyorum. Tetikleyicilerin yanı sıra, iki sütunun eşit değerlere sahip olmasına izin verebilir ve tabloya her zaman bir görünüm yoluyla erişerek satırları yoksayabilirsiniz:

CREATE VIEW foo_correct AS
SELECT id, aa, bb
FROM foo
WHERE aa <> bb ;

Alternatif olarak, Ekleme ve Güncelleme işlemlerini kısıtlamaya dikkat eden ve bunları karşılamayan verilerin eklenmesine (veya değiştirilmesine) izin vermeyen (saklanan) prosedürlerle kısıtlayabilirsiniz.



-1

Söz konusu sütunların her ikisi de aynı Bar tablosuna başvurur. Bar tablosunu, farklı değer kümelerine sahip kimliğe sahip olacak şekilde ikiye bölebilir misiniz?


1
Sonra, üç çiftler var ki Foomasanın: (1,2) (2,3) (3,1). Üç değeri nasıl ayırmalıyız?
ypercubeᵀᴹ

1
Katılıyorum, yanlış öneri.
msi77
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.