2009-04-09 18 views
522

SQLITE में 1 से अधिक कॉलम पर प्राथमिक कुंजी निर्दिष्ट करने के लिए वाक्यविन्यास क्या है?एकाधिक कॉलम पर स्क्लाइट प्राथमिक कुंजी

+9

इसे कंपाउंड कुंजी भी कहा जाता है http://en.wikipedia.org/wiki/Compound_key – OneWorld

+1

@OneWorld या समग्र कुंजी, यदि कोई भी स्तंभ स्वयं कुंजी नहीं है। – Michael

उत्तर

669

documentation के अनुसार, यह

CREATE TABLE something (
    column1, 
    column2, 
    column3, 
    PRIMARY KEY (column1, column2) 
); 
+1

अच्छा, यह सही है, लेकिन प्रलेखन के अनुसार, तालिका कुछ बनाएं (कॉलम 1 प्राथमिक कुंजी, कॉलम 2 प्राथमिक कुंजी); भी संभव होना चाहिए, लेकिन यह नहीं है। – Yar

+4

@Yar दस्तावेज़ कहते हैं, "यदि एक एकल तालिका तालिका में एक से अधिक प्राथमिक कुंजी खंड है, तो यह एक त्रुटि है।" हां, रेलरोड आरेख संकेत दे सकते हैं कि यह भी वैध है, लेकिन नीचे दिया गया पाठ स्पष्ट करता है कि यह नहीं है। –

+3

इस उत्तर में * प्राथमिक कुंजी (कॉलम 1, कॉलम 2) * भाग को अंत में जोड़ने के लिए याद रखें। यदि आप कॉलम 2 परिभाषा के बाद इसे जोड़ने का प्रयास करते हैं तो आपको ** वाक्यविन्यास त्रुटि ** मिल जाएगी। – vovahost

36

हाँ है। लेकिन याद रखें कि ऐसी प्राथमिक कुंजी दोनों कॉलम में कई बार NULL मानों को अनुमति देती है।

जैसे एक तालिका बनाएं:

sqlite> CREATE TABLE something (
column1, column2, value, PRIMARY KEY (column1, column2)); 

अब इस बिना किसी चेतावनी के काम करता है:

sqlite> insert into something (value) VALUES ('bla-bla'); 
sqlite> insert into something (value) VALUES ('bla-bla'); 
sqlite> select * from something; 
NULL|NULL|bla-bla 
NULL|NULL|bla-bla 
+0

क्या इस तरह के व्यवहार के कारण का कोई संदर्भ है? डेटाबेस में कई पंक्तियों को डंप करने का एक अच्छा तरीका क्या होगा और फिर भी डुप्लिकेट हटा दें, भले ही उनमें 'न्यूल' हो? – Pastafarianist

+1

@Pastafarianist http://www.sqlite.org/lang_createtable.html - "एसक्यूएल मानक के अनुसार, प्राथमिक कुंजी हमेशा पूर्ण नहीं होना चाहिए।दुर्भाग्य से, कुछ प्रारंभिक संस्करणों में एक बग के कारण, यह SQLite में नहीं है। [...] अन्य मूल्यों को अन्य सभी मूल्यों से अलग माना जाता है, जिनमें अन्य एनयूएलएल शामिल हैं। " –

+0

हां, एसक्यूएल एनयूएलएल में हमेशा झूठी तुलना की जाती है। इसके कारण, संबंध सिद्धांत विशेष रूप से किसी भी प्रमुख घटक के मूल्य के रूप में NULL को शामिल नहीं करता है। SQLite, हालांकि , व्यावहारिक अभ्यास है। ऐसा लगता है कि लेखकों ने व्यावहारिक रूप से कई को "बराबर" कुंजी की अनुमति नहीं दी है। स्पष्ट रूप से यह बेहतर है कि एनयूएलएल को महत्वपूर्ण मानों के रूप में अनुमति न दें। – holdenweb

144
CREATE TABLE something (
    column1 INTEGER NOT NULL, 
    column2 INTEGER NOT NULL, 
    value, 
    PRIMARY KEY (column1, column2) 
); 
+0

क्या प्राथमिक कुंजी एक पूर्ण नल लागू नहीं करती है? – pratnala

+18

@pratnala मानक SQL में , हां। SQLite में, प्राथमिक कुंजी में 'NULL' की अनुमति है। यह उत्तर जोर देता है कि यदि आप अधिक मानक व्यवहार चाहते हैं, तो आपको' नल नल 'स्वयं जोड़ना होगा। मेरा उत्तर बहु-कॉलम के लिए बहुत ही बुनियादी वाक्यविन्यास है प्राथमिक कुंजी। –

13

प्राथमिक कुंजी फ़ील्ड रिक्त नहीं के रूप में घोषित किया जाना चाहिए (इस रूप में गैर मानक है प्राथमिक कुंजी की परिभाषा यह है कि यह अद्वितीय होना चाहिए और शून्य नहीं होना चाहिए)। लेकिन नीचे किसी भी डीबीएमएस में सभी बहु-स्तंभ प्राथमिक कुंजी के लिए एक अच्छा अभ्यास है।

create table foo 
(
    fooint integer not null 
    ,foobar string not null 
    ,fooval real 
    ,primary key (fooint, foobar) 
) 
; 
6

SQLite के संस्करण 3.8.2 के बाद से, स्पष्ट नहीं NULL विनिर्देशों के लिए एक विकल्प "बिना ROWID" विनिर्देश है: [1]

NOT NULL is enforced on every column of the PRIMARY KEY 
in a WITHOUT ROWID table. 

"बिना ROWID" टेबल संभावित क्षमता फायदे हैं, तो एक कम वर्बोज़ विकल्प पर विचार करना है:

CREATE TABLE t (
    c1, 
    c2, 
    c3, 
    PRIMARY KEY (c1, c2) 
) WITHOUT ROWID; 

उदाहरण के लिए, sqlite3 प्रॉम्प्ट पर: sqlite> insert into t values(1,null,3); Error: NOT NULL constraint failed: t.c2

25

बेसिक:

CREATE TABLE table1 (
    columnA INTEGER NOT NULL, 
    columnB INTEGER NOT NULL, 
    PRIMARY KEY (columnA, columnB) 
); 

अपने कॉलम अन्य तालिकाओं के विदेशी कुंजी (सामान्य मामले) कर रहे हैं:

CREATE TABLE table1 (
    table2_id INTEGER NOT NULL, 
    table3_id INTEGER NOT NULL, 
    FOREIGN KEY (table2_id) REFERENCES table2(id), 
    FOREIGN KEY (table3_id) REFERENCES table3(id), 
    PRIMARY KEY (table2_id, table3_id) 
); 

CREATE TABLE table2 (
    id INTEGER NOT NULL, 
    PRIMARY KEY id 
); 

CREATE TABLE table3 (
    id INTEGER NOT NULL, 
    PRIMARY KEY id 
); 
0

एक और तरीका है, आप यह भी दो स्तंभ प्राथमिक कुंजी बना सकते हैंunique और ऑटो-वृद्धि कुंजी primary। बस इस तरह: https://stackoverflow.com/a/6157337

संबंधित मुद्दे