2012-02-20 6 views

उत्तर

10

अगर यह है कि आप क्या ढूंढ रहे हैं, लेकिन तुम कर सकते हो जाएगा मुझे यकीन है कि नहीं कर रहा हूँ एक चेक बाधा का उपयोग करें:

CREATE TABLE My_Table(my_column varchar(255) 
    check (my_column in ('first', 'second', 'last'))); 

-- fails: 
insert into My_Table values('x'); 

-- ok: 
insert into My_Table values('first'); 

यह एच 2, अपाचे डर्बी, PostgreSQL, HSQLDB में काम करेंगे, और यहां तक ​​कि SQLite भी। मैंने अन्य डेटाबेस का परीक्षण नहीं किया।

+0

वैसे, यह संभव है कि एक enum और संदर्भ तालिका अधिक कुशल है। –

+0

पकड़ यह है कि इस समाधान के साथ संभावित मूल्यों को गिनने का कोई तरीका नहीं है (हालांकि उसे इसकी आवश्यकता नहीं हो सकती है)। – Viruzzo

+0

आपका मतलब है कि आप संभावित मूल्यों को नहीं जानते हैं? आप फिर enum का उपयोग कैसे कर सकते हैं? क्या आपका उदाहरण सही है? –

7

कोई नहीं है; अभी भी, enum किसी भी मामले में एक अच्छा समाधान नहीं है, बस एक संदर्भ तालिका का उपयोग करें।

+6

+1 "enum एक अच्छा समाधान नहीं है" –

2

मैं इस समस्या में भाग गया और इसे एक अलग टेबल और विदेशी कुंजी बाधा बनाकर हल किया।

CREATE TABLE My_Enum_Table (
    my_column varchar(255) UNIQUE 
); 

INSERT INTO My_Enum_Table (my_column) 
VALUES 
    ('First'), 
    ('Second'), 
    ... 
    ('Last'); 

CREATE TABLE My_Table (
    my_column varchar(255), 
    FOREIGN KEY (my_column) REFERENCES My_Enum_Table (my_column) 
); 

इस तरह जब आप एक My_Table में INSERT यह एक विदेशी कुंजी जांच करेंगे यकीन है कि मूल्य तुम डालने रहे My_Enum_Table में है बनाने के लिए करने की कोशिश।

यहाँ हालांकि कुछ व्यापार गत हैं:

  • पेशेवरों
    • आप अभी भी इस के साथ एक ही तरीका है कि आप एक ENUM होगा बातचीत कर सकते हैं।
    • आपको इस अर्थ में थोड़ा अतिरिक्त लचीलापन भी मिलता है कि आप तालिका परिभाषाओं को बदलने के बिना एक और मूल्य जोड़ सकते हैं।
  • कान्स
    • संभवत: यह एक ENUM की तुलना में धीमी है, क्योंकि यह एक मेज लुक-अप करने के लिए है। वास्तव में हालांकि तालिका में उचित रूप से पंक्तियों की एक छोटी संख्या होनी चाहिए, यह शायद काफी नगण्य है। My_Table.my_column पर एक इंडेक्स जोड़ना इससे मदद कर सकता है।
    • यह संदर्भ तालिका में शामिल होने की आवश्यकता को रोकता है लेकिन मूल रूप से डेटाबेस परिप्रेक्ष्य से जटिलता के समान स्तर के साथ। यद्यपि यह शायद एक बड़ा सौदा नहीं है जब तक कि आप किसी अन्य तालिका के साथ अपने डेटाबेस को अव्यवस्थित करने के बारे में चिंतित न हों।
    • यह आपको एक इंजन का उपयोग करने की भी आवश्यकता है जो INNODB जैसे विदेशी कुंजी का समर्थन करता है। मुझे यकीन नहीं है कि यह वास्तव में एक कंस है लेकिन मुझे लगता है कि यह किसी विशेष आवश्यकता वाले व्यक्ति के लिए हो सकता है।
1

लगता एच 2 की तरह enums है: http://www.h2database.com/html/datatypes.html#enum_type

तो ठीक उसी वाक्य रचना काम करना चाहिए। (मुझे नहीं पता कि सेमेन्टिक्स कितनी बारीकी से मेल खाता है।)

+0

अब इसका समर्थन है, [** संस्करण 1.4.195 ** के रूप में, 2017-04-23 को जारी किया गया] (http://www.h2database.com/html/changelog.html), लेकिन तब नहीं था सवाल लिखा गया था। शायद आप अपने उत्तर में स्पष्टीकरण देना चाहते हैं। –

0

अपग्रेड h2 जार

एच 2 Maven भंडार: https://mvnrepository.com/artifact/com.h2database/h2

जार संस्करणों:

1.4.196 सेंट्रल (जून, 2017) - enum समर्थन (परीक्षण किया)

1,4। 1 9 2 सेंट्रल (मई, 2016) - enum समर्थन की कमी (भी परीक्षण)