क्या मैं यह सुनिश्चित कर सकता हूं कि दो कॉलम का समान मूल्य न हो


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आवेदन स्तर के तर्क का उपयोग करने के अलावा या BESORE INSERT पर विफल होने के लिए ट्रिगर को मजबूर किया जाए?

जवाबों:


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

एक ही बार टेबल के संदर्भ में दोनों कॉलम। क्या आप बार टेबल को दो में विभाजित कर सकते हैं, ताकि उनमें वैल्यू के विभिन्न सेट के साथ आईडी हो?


1
फिर, मान लें कि हमारे पास Fooतालिका में तीन जोड़े हैं (1,2) (2,3) (3,1):। हमें तीन मूल्यों को कैसे विभाजित करना चाहिए?
ypercube y

1
मैं सहमत हूं, गलत सुझाव है।
msi77
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.