@ रोलैंडो द्वारा अच्छा ट्रिगर समाधान के अलावा, MySQL में इस समस्या का एक और समाधान है (जब तक कि CHECK
बाधाओं को लागू नहीं किया जाता है)।
CHECK
MySQL में कुछ बाधाओं का अनुकरण कैसे करें
इसलिए, यदि आप संदर्भात्मक अखंडता बाधाओं को पसंद करते हैं और ट्रिगर से बचना चाहते हैं (क्योंकि MySQL में मुद्दों के दौरान जब आप दोनों अपने टेबल में हैं), तो आप एक और छोटी संदर्भ तालिका का उपयोग कर सकते हैं:
CREATE TABLE age_allowed
( age TINYINT UNSIGNED NOT NULL
, PRIMARY KEY (age)
) ENGINE = InnoDB ;
इसे 20 पंक्तियों के साथ भरें:
INSERT INTO age_allowed
(age)
VALUES
(0), (1), (2), (3), ..., (19) ;
तब आपकी तालिका यह होगी:
CREATE TABLE test
( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT
, age TINYINT UNSIGNED NOT NULL
, PRIMARY KEY (id)
, CONSTRAINT age_allowed__in__test
FOREIGN KEY (age)
REFERENCES age_allowed (age)
) ENGINE = InnoDB ;
age_allowed
आकस्मिक जोड़ या पंक्तियों को हटाने से बचने के लिए, आपको तालिका तक लेखन पहुंच को हटाना होगा ।
यह ट्रिक FLOAT
डेटाटाइप कॉलम के साथ काम नहीं करेगा , दुर्भाग्य से (बीच में 0.0
और भी बहुत सारे मूल्य 20.0
)।
CHECK
MySQL (5.7) और मारियाबीडी में मनमाने ढंग से अवरोधों का अनुकरण कैसे करें (5.2 से 10.1 तक)
चूंकि मारबीडीबी ने अपने 5.2 संस्करण (जीए रिलीज: 2010-11-10 ) और MySQL में 5.7 (जीए रिलीज: 2015-10-21 ) में गणना किए गए कॉलम जोड़े हैं - जो वे उन्हें VIRTUAL
और GENERATED
क्रमशः कहते हैं - जिसे बरकरार रखा जा सकता है, अर्थात इसमें संग्रहीत तालिका - वे उन्हें PERSISTENT
और STORED
क्रमशः कहते हैं - हम उन्हें उपरोक्त समाधान को सरल बनाने के लिए उपयोग कर सकते हैं और इससे भी बेहतर, इसे मनमाना CHECK
बाधाओं को लागू करने / लागू करने के लिए बढ़ा सकते हैं ):
ऊपर के रूप में, हमें एक सहायता तालिका की आवश्यकता होगी लेकिन इस बार एक एकल पंक्ति के साथ जो "लंगर" तालिका के रूप में काम करेगी। इससे भी बेहतर, इस तालिका का उपयोग किसी भी संख्या में CHECK
बाधाओं के लिए किया जा सकता है ।
हम फिर एक गणना कॉलम जोड़ते हैं जो या तो TRUE
/ FALSE
/ का मूल्यांकन करता है UNKNOWN
, बिल्कुल एक CHECK
बाधा के रूप में - लेकिन यह कॉलम FOREIGN KEY
हमारी लंगर तालिका के लिए एक बाधा है। यदि FALSE
कुछ पंक्तियों के लिए स्थिति / स्तंभ का मूल्यांकन किया जाता है , तो एफके के कारण पंक्तियों को अस्वीकार कर दिया जाता है।
यदि स्थिति / स्तंभ ( TRUE
या ) का मूल्यांकन करता है , तो पंक्तियों को अस्वीकार नहीं किया जाता है, ठीक वैसे ही जैसा कि बाधाओं के साथ होना चाहिए :UNKNOWN
NULL
CHECK
CREATE TABLE truth
( t BIT NOT NULL,
PRIMARY KEY (t)
) ENGINE = InnoDB ;
-- Put a single row:
INSERT INTO truth (t)
VALUES (TRUE) ;
-- Then your table would be:
-- (notice the change to `FLOAT`, to prove that we don't need)
-- (to restrict the solution to a small type)
CREATE TABLE test
( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
age FLOAT NOT NULL,
age_is_allowed BIT -- GENERATED ALWAYS
AS (age >= 0 AND age < 20) -- our CHECK constraint
STORED,
PRIMARY KEY (id),
CONSTRAINT check_age_must_be_non_negative_and_less_than_20
FOREIGN KEY (age_is_allowed)
REFERENCES truth (t)
) ENGINE = InnoDB ;
इसका उदाहरण MySQL 5.7 संस्करण है। मारियाबीडी (संस्करण 5.2+ से 10.1 तक) में, हमें सिंटैक्स को संशोधित करने और PERSISTENT
इसके बजाय कॉलम को घोषित करने की आवश्यकता है STORED
। संस्करण 10.2 में STORED
कीवर्ड को भी जोड़ा गया था, इसलिए ऊपर का उदाहरण नवीनतम संस्करणों के लिए दोनों फ्लेवर (MySQL और MariaDB) में काम करता है।
यदि हम कई CHECK
बाधाओं (जो कई डिजाइनों में आम है) को लागू करना चाहते हैं , तो हमें बस उनमें से प्रत्येक के लिए एक गणना कॉलम और एक विदेशी कुंजी जोड़ना होगा। हमें truth
डेटाबेस में केवल एक टेबल चाहिए । इसमें एक पंक्ति सम्मिलित होनी चाहिए और फिर सभी लिखी गई पहुंच हटा दी जानी चाहिए।
हालांकि, मारियाडीबी के ताजा आंकड़ों में, हमें इन सभी कलाबाजियों को और अधिक करने की आवश्यकता नहीं है, क्योंकि CHECK
बाधाओं को 10.2.1 संस्करण में लागू किया गया है (अल्फा रिलीज: 2016-जुलाई -04)!
वर्तमान 10.2.2 संस्करण अभी भी एक बीटा संस्करण है, लेकिन ऐसा लगता है कि यह सुविधा मारियाडीबी 10.2 श्रृंखला के पहले स्थिर रिलीज में उपलब्ध होगी।