MySQL के लिए जिसमें अनुक्रमित फ़िल्टर नहीं है, आप निम्न की तरह कुछ कर सकते हैं। यह इस तथ्य का शोषण करता है कि MySQL अद्वितीय अनुक्रमित में कई NULLs की अनुमति देता है, और एक समर्पित तालिका का उपयोग करने के लिए एक समर्पित तालिका और एक विदेशी कुंजी का उपयोग करता है जिसमें केवल NULL और 1 मान हो सकते हैं।
इस समाधान के साथ, सही / गलत के बजाय, आप सिर्फ 1 / NULL का उपयोग करेंगे।
CREATE TABLE DefaultFlag (id TINYINT UNSIGNED NOT NULL PRIMARY KEY);
INSERT INTO DefaultFlag (id) VALUES (1);
CREATE TABLE PostalCodes (
ID INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
Zip VARCHAR (32) NOT NULL,
isDefault TINYINT UNSIGNED NULL DEFAULT NULL,
CONSTRAINT FOREIGN KEY (isDefault) REFERENCES DefaultFlag (id),
UNIQUE KEY (isDefault)
);
INSERT INTO PostalCodes (Zip, isDefault) VALUES ('123', 1 );
/* Only one row can be default */
INSERT INTO PostalCodes (Zip, isDefault) VALUES ('abc', 1 );
/* ERROR 1062 (23000): Duplicate entry '1' for key 'isDefault' */
/* MySQL allows multiple NULLs in unique indexes */
INSERT INTO PostalCodes (Zip, isDefault) VALUES ('456', NULL);
INSERT INTO PostalCodes (Zip, isDefault) VALUES ('789', NULL);
/* only NULL and 1 are admitted in isDefault thanks to foreign key */
INSERT INTO PostalCodes (Zip, isDefault) VALUES ('789', 2 );
/* ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`PostalCodes`, CONSTRAINT `PostalCodes_ibfk_1` FOREIGN KEY (`isDefault`) REFERENCES `DefaultFlag` (`id`))*/
केवल एक चीज जो गलत हो सकती है, मुझे लगता है, अगर कोई व्यक्ति DefaultFlag
तालिका में एक पंक्ति जोड़ता है । मुझे लगता है कि यह एक बड़ी चिंता नहीं है, और यदि आप वास्तव में सुरक्षित रहना चाहते हैं तो आप इसे हमेशा अनुमतियों के साथ ठीक कर सकते हैं।
PostalCodes
खाली होने पर क्या ? यदि एक पंक्ति में पहले से ही संपत्ति है, तो इसे तब तक झूठे पर सेट होने से रोका जाना चाहिए जब तक कि एक ही SQL कथन के भीतर कोई अन्य पंक्ति (यदि मौजूद नहीं है) सही है? क्या शून्य पंक्तियों में लेनदेन सीमाओं के बीच संपत्ति हो सकती है? क्या तालिका में अंतिम पंक्ति को संपत्ति होने के लिए मजबूर किया जाना चाहिए और हटाए जाने से रोका जाना चाहिए? अनुभव मुझे बताता है कि "वास्तव में एक पंक्ति की गारंटी" वास्तव में कुछ अलग करने का मतलब है, अक्सर "सबसे अधिक एक पंक्ति में"।