ฉันขอแน่ใจได้หรือไม่ว่าสองคอลัมน์ไม่มีค่าเดียวกัน


11

หากฉันมีตารางที่มีลักษณะเช่นนี้

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 != bbนอกเหนือจากการใช้ตรรกะระดับแอปพลิเคชันหรือบังคับให้ทริกเกอร์ล้มเหลวก่อนที่จะแทรก?

คำตอบ:


3

MySQL ไม่สนับสนุนการCHECKโต้ตอบโดยตรงแม้ว่าคุณจะมีเวอร์ชั่นล่าสุดเพียงพอก็รองรับทริกเกอร์และการเพิ่มข้อผิดพลาดผ่านSIGNALดังนั้นคุณสามารถกำหนดBEFORE INSERTและBEFORE UPDATEทริกเกอร์ที่ตรวจสอบข้อมูลและเพิ่มข้อผิดพลาดหากข้อ จำกัด ที่ตั้งใจไม่เป็นที่พอใจ

สิ่งนี้จะมีประสิทธิภาพน้อยกว่าการสนับสนุนแบบดั้งเดิมสำหรับข้อ จำกัด ในการตรวจสอบของหลักสูตรดังนั้นหากคุณทำการเขียนในปริมาณมากไปยังโครงสร้างนั้นต้องแน่ใจว่าวิเคราะห์ความแตกต่างของประสิทธิภาพที่เกิดจากทริกเกอร์ในกรณีที่มันเป็นอันตรายต่อแอปพลิเคชันของคุณมากเกินไป


9

ไม่คุณไม่สามารถ ใน DBMS ส่วนใหญ่ (Postgres, SQL-Server, Oracle, DB2 และอื่น ๆ อีกมากมาย) คุณสามารถเพิ่มCHECKข้อ จำกัด :

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

ฉันไม่เห็นวิธีที่จะมีสิ่งนี้ใน MySQL โดยใช้ข้อ จำกัด การอ้างอิงเท่านั้น นอกจากทริกเกอร์คุณสามารถอนุญาตให้ทั้งสองคอลัมน์มีค่าเท่ากันและไม่สนใจแถวโดยการเข้าถึงตารางผ่านมุมมองเสมอ:

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

หรือคุณสามารถ จำกัด การแทรกและอัปเดตการดำเนินการผ่าน (ที่เก็บไว้) ขั้นตอนที่ดูแลข้อ จำกัด และไม่อนุญาตให้มีการแทรกข้อมูล (หรือเปลี่ยนแปลง) ที่ไม่เป็นไปตามที่กำหนดไว้



-1

คอลัมน์ทั้งสองในคำถามอ้างอิงถึงตารางบาร์เดียวกัน คุณสามารถแบ่งตารางบาร์ออกเป็นสองชุดเพื่อให้มี ID พร้อมชุดค่าที่แตกต่างกันได้หรือไม่


1
แล้วบอกว่าเรามีสามคู่ในตาราง:Foo (1,2) (2,3) (3,1)เราควรแยกสามค่านี้อย่างไร?
ypercubeᵀᴹ

1
ฉันเห็นด้วยข้อเสนอแนะที่ผิด
msi77
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.