सवाल SQLite में ENUM प्रकार कैसे बनाएं?


मुझे एक टेबल को MySQL से SQLite में कनवर्ट करने की आवश्यकता है, लेकिन मैं यह समझ नहीं सकता कि एनम फ़ील्ड को कैसे परिवर्तित किया जाए, क्योंकि मुझे नहीं मिल रहा ENUM SQLite टाइप करें।

उपर्युक्त क्षेत्र है pType निम्नलिखित तालिका में:

CREATE TABLE `prices` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `pName` VARCHAR(100) NOT NULL DEFAULT '',
    `pType` ENUM('M','R','H') NOT NULL DEFAULT 'M',
    `pField` VARCHAR(50) NULL DEFAULT NULL,
    `pFieldExt` VARCHAR(50) NULL DEFAULT NULL,
    `cmp_id` INT(11) NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`)
)
ENGINE=MyISAM
ROW_FORMAT=DEFAULT

मुझे उपयोगकर्ता के चयन के लिए केवल तीन मानों के साथ एक फ़ील्ड चाहिए, और मैं डीबी में इसे लागू करना चाहता हूं, न केवल मेरे आवेदन में।


76
2018-03-14 13:34


मूल




जवाब:


SQLite में कोई enum प्रकार नहीं है, केवल निम्न:

  • शून्य
  • पूर्णांक
  • असली
  • पाठ
  • ब्लॉब

स्रोत: http://www.sqlite.org/datatype3.html

मुझे डर है कि आपके मामले में एक छोटी, कस्टम एनम टेबल की आवश्यकता होगी।


54
2018-03-14 15:52



असल में "एक कस्टम एनम टेबल" एक बहुत साफ डिजाइन है जो वास्तविक enums का उपयोग कर रहा है - a_horse_with_no_name
क्यों केवल तीन संभावित तारों की अनुमति देने के लिए चेक () बाधा का उपयोग न करें? - mateusza
> केवल तीन संभावित तारों की अनुमति दें: स्ट्रिंग के लिए संग्रहण की वजह से? - Caleb Paul
@Wideshanks मुझे नहीं लगता CHECK() उस वक्त अस्तित्व में था जब मैंने जवाब लिखा था। जब तक स्ट्रिंग नहीं है वास्तव में छोटा, मैं इसके खिलाफ पूरी तरह से हूं। अधिकतम 1 या 2 अक्षर। - MPelletier
@ हैमन सैम्युएल यह नया नहीं है, इसे अर्थ के रूप में हल किया गया है TEXT। मैंने दिए गए स्रोत पृष्ठ पर, कॉलम एफ़िनिटी के निर्धारण पर बिंदु 2.1 देखें। - MPelletier


SQLite रास्ता

CREATE TABLE prices (
 id INTEGER PRIMARY KEY,
 pName TEXT CHECK( LENGTH(pName) <= 100 ) NOT NULL DEFAULT '',
 pType TEXT CHECK( pType IN ('M','R','H') ) NOT NULL DEFAULT 'M',
 pField TEXT CHECK( LENGTH(pField) <= 50 ) NULL DEFAULT NULL,
 pFieldExt TEXT CHECK( LENGTH(pFieldExt) <= 50 ) NULL DEFAULT NULL,
 cmp_id INTEGER NOT NULL DEFAULT '0'
)

59
2018-06-19 23:29





भविष्य में आने वाले अन्य लोगों के लिए, एमपीएललेटियर के उत्तर पर विस्तार करने के लिए, आप टेबल को इस प्रकार बना सकते हैं:

CREATE TABLE Price (
  PriceId INTEGER       PRIMARY KEY AUTOINCREMENT NOT NULL,
  Name    VARCHAR(100)  NOT NULL,
  Type    CHAR(1)       NOT NULL DEFAULT ('M') REFERENCES PriceType(Type)
);

CREATE TABLE PriceType (
  Type    CHAR(1)       PRIMARY KEY NOT NULL,
  Seq     INTEGER
);
INSERT INTO PriceType(Type, Seq) VALUES ('M',1);
INSERT INTO PriceType(Type, Seq) VALUES ('R',2);
INSERT INTO PriceType(Type, Seq) VALUES ('H',3);

इस तरह से किया गया है, गणना मूल्य सीधे मूल्य तालिका में उपलब्ध हैं क्योंकि वे एक ईएनएन का उपयोग करेंगे: टाइप मान प्राप्त करने के लिए आपको प्राइसटाइप तालिका में शामिल होने की आवश्यकता नहीं है, अगर आप निर्धारित करना चाहते हैं तो आपको केवल इसका उपयोग करने की आवश्यकता है ENUMs का अनुक्रम।

SQL कुंजी संस्करण 3.6.1 9 में विदेशी कुंजी बाधाओं को पेश किया गया था।


49
2018-05-30 07:30



INSERT INTO PriceType(Type, Seq) VALUES ('M',1), ('R',2), ('H',3); आपको एक वाक्यविन्यास त्रुटि मिलनी चाहिए। "पहला फॉर्म (" VALUES "कीवर्ड के साथ) मौजूदा तालिका में एक नई पंक्ति बनाता है।": sqlite.org/lang_insert.html। इसे तोड़ो इससे बचें: INSERT INTO PriceType(Type, Seq) VALUES ('M',1); INSERT INTO PriceType(Type, Seq) VALUES ('R',2); INSERT INTO PriceType(Type, Seq) VALUES ('H',3); - ahcox
एक जवाब था जिसका मतलब एक टिप्पणी होना था, लेकिन अब यह चला गया है। अनिवार्य रूप से, SQLite 3.7.11 के बाद, INSERT के साथ कई प्रविष्टियां की जा सकती हैं। सही वाक्यविन्यास अभी भी काम करता है। - MPelletier
मत भूलना PRAGMA foreign_keys = ON; प्रत्येक सत्र के लिए - क्योंकि fqs डिफ़ॉल्ट रूप से sqlite3 में अक्षम हैं - smathy
यदि आप भूलने से बचने के लिए wnat PRAGMA foreign_keys = ON; तो आप इसे अपनी होम निर्देशिका में अपनी .sqliterc फ़ाइल में सेट कर सकते हैं। - Eradicatore
इसके अलावा, आप इसका उपयोग करना चाह सकते हैं UNIQUE सेक पर बाधा कुछ इस तरह CREATE TABLE PriceType( Type Char(1) PRIMARY KEY NOT NULL, Seq INTEGER UNIQUE); - Eradicatore