SQLite এ ENUM টাইপ কীভাবে তৈরি করবেন?


106

আমার মাইএসকিউএল থেকে এসকিউএলাইটে একটি টেবিল রূপান্তরিত করতে হবে, তবে আমি এনাম ক্ষেত্রটি কীভাবে রূপান্তর করব তা বুঝতে পারি না, কারণ এসকিউএলাইটে ENUMটাইপ খুঁজে পাচ্ছি না ।

পূর্বোক্ত ক্ষেত্রটি 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

ব্যবহারকারীর চয়ন করার জন্য আমার কেবল তিনটি মান সহ একটি ক্ষেত্র প্রয়োজন এবং আমি কেবল আমার প্রয়োগের মধ্যে নয়, ডিবিতে এটি প্রয়োগ করতে চাই।

উত্তর:


83

এসকিউএলাইটে কোনও এনাম টাইপ নেই, কেবল নিম্নলিখিত:

  • শূন্য
  • শর্তযুক্ত
  • বাস্তব
  • পাঠ্য
  • ব্লগ

সূত্র: http://www.sqlite.org/datatype3.html

আমি আশঙ্কা করছি আপনার ক্ষেত্রে একটি ছোট, কাস্টম এনাম টেবিলের প্রয়োজন হবে।


26
আসলে "একটি কাস্টম এনাম টেবিল" হ'ল অনেকগুলি ক্লিনার ডিজাইন যা আসল
এনামগুলি

20
কেবল তিনটি সম্ভাব্য স্ট্রিংকে অনুমতি দেওয়ার জন্য কেন চেক () সীমাবদ্ধতা ব্যবহার করবেন না?
mateusza

4
@ ওয়াইডশ্যাঙ্কস আমি মনে করি না CHECK()যে আমি যখন উত্তরটি লিখেছিলাম তখন তার অস্তিত্ব ছিল। যদি না স্ট্রিং সত্যিই সংক্ষিপ্ত, আমি সম্পূর্ণই এটি বিরুদ্ধে নই। সর্বাধিক 1 বা 2 টি অক্ষর।
এমপিলেটিয়ার

আমি VARCHARআমার এসকিউএলাইট সংস্করণে ব্যবহার করতে পারি , এটি কি নতুন ধরণের সংযোজন?
হামান স্যামুয়েল

4
@ হামানসামুয়েল এটি নতুন নয়, এটি অর্থ হিসাবে সমাধান হয়েছে TEXT। আমি যে উত্স পৃষ্ঠায় দিয়েছি, কলাম আধ্যাত্মিকতা নির্ধারণের ২.১ পয়েন্টটি দেখুন।
এমপিলেটিয়ার

112

এসকিউএলাইট উপায় হল একটি চেক সীমাবদ্ধতা ব্যবহার করা ।

কিছু উদাহরণ:

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'
)

এই সীমা হবে pTypeশুধু মান কলাম M, Rএবং H, ঠিক enum("M", "R", "H")কিছু অন্যান্য এসকিউএল ইঞ্জিন করতে হবে।


4
ওয়েলপ, আসলে এই বাস্তবায়ন পুরোপুরি অনুকরণ করে না enumকারণ এটি মানগুলির পূর্ণসংখ্যা সূচক অনুসারে বাছাই করা অসম্ভব করে তোলে (যা প্রকৃত enumক্ষেত্রের সাথে সম্ভব )। শুধু, প্রত্যেকে, এটি মনে রাখবেন।
বরিস ডি তেওহরভ

54

এমপিলেটিয়ারের উত্তরটি প্রসারিত করতে আপনি এই জাতীয় সারণী তৈরি করতে পারেন:

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

বিদেশী কী বাধাগুলি এসকিউএলাইট সংস্করণ 3.6.19 এ চালু করা হয়েছিল।


4
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);
আহকক্স

9
PRAGMA foreign_keys = ON;প্রতিটি সেশনে ভুলে যাবেন না - কারণ ফেকিগুলি
স্ক্যালিটি

4
আপনি যদি ভুলে যাওয়া এড়াতে PRAGMA foreign_keys = ON;না চান তবে আপনি নিজের বাড়ির ডিরেক্টরিতে এটি .Slliterc ফাইলটিতে সেট করতে পারেন।
এরাদিক্যাটোর

4
এছাড়াও, আপনি UNIQUEসিকের প্রতিবন্ধকতা ব্যবহার করতে চাইতে পারেন । এরকম কিছুCREATE TABLE PriceType( Type Char(1) PRIMARY KEY NOT NULL, Seq INTEGER UNIQUE);
এরাদিক্যাটোর

4
আপনি কেবল ডিফল্ট রোউইড কলামটি ব্যবহার না করে আলাদা 'সিক' কলামটি তৈরি করবেন কেন ?
পার্থিয়ান শট 23
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.