MySQL
enum
खोज…
ENUM क्यों?
ENUM एक पंक्ति के लिए एक विशेषता प्रदान करने का एक तरीका प्रदान करता है। कम संख्या में गैर-संख्यात्मक विकल्पों के साथ काम करना सबसे अच्छा काम करता है। उदाहरण:
reply ENUM('yes', 'no')
gender ENUM('male', 'female', 'other', 'decline-to-state')
मूल्य तार हैं:
INSERT ... VALUES ('yes', 'female')
SELECT ... --> yes female
विकल्प के रूप में टिनिनेट करें
मान लीजिए कि हमारे पास है
type ENUM('fish','mammal','bird')
एक विकल्प है
type TINYINT UNSIGNED
प्लस
CREATE TABLE AnimalTypes (
type TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT "('fish','mammal','bird')",
PRIMARY KEY(type),
INDEX(name)
) ENGINE=InnoDB
जो कई-कई-कई तालिका की तरह है।
तुलना, और बेहतर या बदतर ENUM से:
- (बदतर) INSERT:
type
देखने की जरूरत है - (बदतर) चयन: स्ट्रिंग प्राप्त करने के लिए शामिल होने की आवश्यकता है (ENUM आपको बिना किसी प्रयास के स्ट्रिंग प्रदान करता है)
- (बेहतर) नए प्रकार जोड़ना: बस इस तालिका में डालें। ENUM के साथ, आपको ALTER TABLE करने की आवश्यकता है।
- (वही) या तो तकनीक (255 मान तक) केवल 1 बाइट लेती है।
- (मिश्रित) डेटा अखंडता का एक मुद्दा भी है:
TINYINT
अवैध मूल्यों को स्वीकार करेगा; जबकिENUM
उन्हें एक विशेष रिक्त-स्ट्रिंग मान पर सेट करता है (जब तक कि सख्त SQL मोड सक्षम न हो, जिस स्थिति में उन्हें अस्वीकार कर दिया जाता है)। बेहतर डेटा अखंडताTINYINT
साथ इसे एक लुकअप टेबल में एक विदेशी कुंजी बनाकर प्राप्त किया जा सकता है: जो, उपयुक्त प्रश्नों /TINYINT
साथ है, लेकिन दूसरी तालिका में पहुंचने की छोटी लागत अभी भी है। (FOREIGN KEYs
मुक्त नहीं हैं।)
एक विकल्प के रूप में VARCHAR
मान लीजिए कि हमारे पास है
type ENUM('fish','mammal','bird')
एक विकल्प है
type VARCHAR(20) COMENT "fish, bird, etc"
यह उस तरह का खुला अंत है जिसमें नए प्रकार तुच्छ रूप से जोड़े जाते हैं।
तुलना, और बेहतर या बदतर ENUM से:
- (वही) INSERT: बस स्ट्रिंग प्रदान करें
- (बदतर?) INSERT पर एक टाइपो किसी का ध्यान नहीं जाएगा
- (वही) का चयन करें: वास्तविक स्ट्रिंग लौटा दी गई है
- (बदतर) बहुत अधिक जगह की खपत होती है
एक नया विकल्प जोड़ना
ALTER TABLE tbl MODIFY COLUMN type ENUM('fish','mammal','bird','insect');
टिप्पणियाँ
- MODIFY COLUMN के सभी मामलों के साथ, आपको
NOT NULL
और किसी भी अन्य क्वालीफायर को शामिलNOT NULL
करना चाहिए जो मूल रूप से मौजूद थे, अन्यथा वे खो जाएंगे। - यदि आप सूची के अंत में जोड़ते हैं और सूची 256 आइटम के नीचे है, तो
ALTER
केवल स्कीमा को बदलकर किया जाता है। यही कारण है कि एक लंबी टेबल कॉपी नहीं होगी। (MySQL के पुराने संस्करणों में यह अनुकूलन नहीं था।)
NULL vs NULL नहीं
क्या होता है जब NULL और 'खराब-मूल्य' के उदाहरणों को अशक्त और अशक्त स्तंभों में संग्रहीत नहीं किया जाता है। इसके अलावा +0
से संख्यात्मक के लिए कास्टिंग का उपयोग दिखाता है।
CREATE TABLE enum (
e ENUM('yes', 'no') NOT NULL,
enull ENUM('x', 'y', 'z') NULL
);
INSERT INTO enum (e, enull)
VALUES
('yes', 'x'),
('no', 'y'),
(NULL, NULL),
('bad-value', 'bad-value');
Query OK, 4 rows affected, 3 warnings (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 3
mysql>SHOW WARNINGS;
+---------+------+--------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------+
| Warning | 1048 | Column 'e' cannot be null |
| Warning | 1265 | Data truncated for column 'e' at row 4 |
| Warning | 1265 | Data truncated for column 'enull' at row 4 |
+---------+------+--------------------------------------------+
3 rows in set (0.00 sec)
उन आवेषण के बाद तालिका में क्या है। यह "+0" का उपयोग करता है कि यह देखने के लिए कि क्या संग्रहित है।
mysql>SELECT e, e+0 FROM enum;
+-----+-----+
| e | e+0 |
+-----+-----+
| yes | 1 |
| no | 2 |
| | 0 | -- NULL
| | 0 | -- 'bad-value'
+-----+-----+
4 rows in set (0.00 sec)
mysql>SELECT enull, enull+0 FROM enum;
+-------+---------+
| enull | enull+0 |
+-------+---------+
| x | 1 |
| y | 2 |
| NULL | NULL |
| | 0 | -- 'bad-value'
+-------+---------+
4 rows in set (0.00 sec)
Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow