Bisakah saya memastikan dua kolom tidak memiliki nilai yang sama

11

Jika saya punya meja yang terlihat seperti ini

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)
)

Apakah ada cara untuk memastikan bahwa aa != bbselain menggunakan logika level aplikasi atau memaksa pemicu gagal pada SEBELUM INSERT?

Nifle
sumber

Jawaban:

3

MySQL tidak mendukung CHECKcontrsaints secara langsung, meskipun jika Anda memiliki versi yang cukup baru ini mendukung pemicu dan peningkatan kesalahan melalui SIGNAL, sehingga Anda dapat menentukan BEFORE INSERTdan BEFORE UPDATEmemicu yang memeriksa data dan meningkatkan kesalahan jika kendala yang dimaksud tidak puas.

Ini akan kurang efisien daripada dukungan asli untuk kendala pemeriksaan, jadi jika Anda melakukan volume penulisan yang tinggi untuk struktur itu, pastikan untuk menganalisis perbedaan kinerja yang disebabkan oleh pemicu jika itu terlalu banyak merusak aplikasi Anda.

David Spillett
sumber
8

Tidak bisa. Di sebagian besar DBMS (Postgres, SQL-Server, Oracle, DB2, dan banyak lainnya), Anda bisa menambahkan CHECKbatasan:

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

Saya tidak melihat cara untuk memilikinya di MySQL, hanya menggunakan batasan referensial. Selain pemicu, Anda bisa mengizinkan kedua kolom memiliki nilai yang sama dan mengabaikan baris dengan mengakses tabel selalu melalui tampilan:

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

Atau, Anda dapat membatasi operasi Sisipkan dan Perbarui melalui prosedur (tersimpan) yang menangani kendala dan tidak mengizinkan data untuk dimasukkan (atau diubah) yang tidak memenuhinya.

ypercubeᵀᴹ
sumber
-1

Kedua kolom dalam referensi pertanyaan ke tabel Bar yang sama. Bisakah Anda membagi tabel Bar menjadi dua sehingga mengandung id dengan set nilai yang berbeda?

msi77
sumber
1
Kemudian, katakanlah kita memiliki tiga pasangan dalam Footabel: (1,2) (2,3) (3,1). Bagaimana seharusnya kita membagi tiga nilai?
ypercubeᵀᴹ
1
Saya setuju, saran yang salah.
msi77