खोज…


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