एकाधिक स्तंभों पर Sqlite प्राथमिक कुंजी


619

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


14
इसे यौगिक कुंजी en.wikipedia.org/wiki/Compound_key
OneWorld

6
@OneWorld या कम्पोज़िट कुंजी, यदि कोई भी कॉलम स्वयं की कुंजी नहीं है।
माइकल

जवाबों:


805

के मुताबिक प्रलेखन के , यह है

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

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

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

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

159
CREATE TABLE something (
  column1 INTEGER NOT NULL,
  column2 INTEGER NOT NULL,
  value,
  PRIMARY KEY ( column1, column2)
);

क्या प्राथमिक कुंजी नहीं भरी हुई नहीं है?
प्रातनाला

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

42

हाँ। लेकिन याद रखें कि ऐसी प्राथमिक कुंजी 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

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

4
@Pastafarianist sqlite.org/lang_createtable.html - "SQL मानक के अनुसार, PRIMARY KEY को हमेशा NULL नहीं होना चाहिए। दुर्भाग्य से, कुछ शुरुआती संस्करणों में बग के कारण, SQLite में ऐसा नहीं है। [...] NULL मूल्यों को अन्य NULLs सहित अन्य सभी मूल्यों से अलग माना जाता है। "
अविश्वसनीय जन

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

31

मूल:

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

14

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

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

11

SQLite के संस्करण 3.8.2 के बाद से, स्पष्ट नॉट स्पेसिफिकेशंस के विकल्प के लिए "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


आजकल इसे पढ़ने वाले किसी भी व्यक्ति के लिए: WITHOUT ROWIDइसके अतिरिक्त निहितार्थ हैं, और इसे NOT NULLआपकी प्राथमिक कुंजी के आगे लिखने के विकल्प के रूप में उपयोग नहीं किया जाना चाहिए ।
छायाकार

2

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


यह वही है जो मैं बिल्कुल देख रहा था। धन्यवाद!
स्वधाकर C

2

PRIMARY KEY (id, name)मेरे लिए काम नहीं किया। बाधा जोड़ने के बजाय काम किया।

CREATE TABLE IF NOT EXISTS customer (id INTEGER, name TEXT, user INTEGER, CONSTRAINT PK_CUSTOMER PRIMARY KEY (user, id))


1

निम्न कोड SQLite में प्राथमिक कुंजी के रूप में 2 कॉलम के साथ एक तालिका बनाता है ।

समाधान:

CREATE TABLE IF NOT EXISTS users (id TEXT NOT NULL, name TEXT NOT NULL, pet_name TEXT, PRIMARY KEY (id, name))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.