SQLite टेबल बाधा - कई स्तंभों पर अद्वितीय


179

मैं SQLite वेबसाइट पर इस पर सिंटैक्स "चार्ट" पा सकता हूं, लेकिन कोई उदाहरण नहीं और मेरा कोड दुर्घटनाग्रस्त हो रहा है। मेरे पास एकल स्तंभ पर अद्वितीय बाधाओं के साथ अन्य तालिकाएं हैं, लेकिन मैं दो स्तंभों पर तालिका में एक बाधा जोड़ना चाहता हूं। यह वही है जो मेरे पास "सिंटैक्स त्रुटि" संदेश के साथ SQLiteException पैदा कर रहा है।

CREATE TABLE name (column defs) 
UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE

मैं यह निम्नलिखित के आधार पर कर रहा हूं:

टेबल बाधा

स्पष्ट होने के लिए, मेरे द्वारा दिए गए लिंक पर प्रलेखन कहता है कि CONTSTRAINT nameमेरी बाधा परिभाषा से पहले आना चाहिए।

हालांकि कुछ ऐसा हो सकता है जिससे समाधान हो सकता है कि जो कुछ भी मेरी कोष्ठबद्ध स्तंभ परिभाषाओं का अनुसरण करता है वह वह है जो डिबगर के बारे में शिकायत करता है।

अगर मैं डालूं

...last_column_name last_col_datatype) CONSTRAINT ...

त्रुटि "CONSTRAINT" के पास है: वाक्यविन्यास त्रुटि

अगर मैं डालूं

...last_column_name last_col_datatype) UNIQUE ...

त्रुटि "UNIQUE" के पास है: सिंटैक्स त्रुटि


1
शुरू होने से पहले UNIQUE एक अल्पविराम याद कर रहा है ..
माजिद बशीर

जवाबों:


345

स्तंभ परिभाषा अनुभाग के भीतर अद्वितीय घोषणा रखें; काम कर उदाहरण:

CREATE TABLE a (
    i INT,
    j INT,
    UNIQUE(i, j) ON CONFLICT REPLACE
);

6
अच्छा जवाब +1। क्या यह वाक्यविन्यास मुझे नियमित रूप से डालने की विधि का उपयोग करने की अनुमति देता है, और नहीं SQLiteDatabase.CONFLICT_REPLACE ध्वज के साथ InsertWithOnConflict?
ओलेग बेलौसोव

3
मैं ON CONFLICT IGNORE2 से अधिक कॉलम के साथ (अभी तक प्रतिस्थापित करने की कोशिश नहीं की गई है) का उपयोग कर रहा हूं , लेकिन मैं इसे अद्वितीय बाधा के सम्मान में नहीं देख रहा हूं, यह केवल डुप्लिकेट जोड़ता है।
माइकल

5
जाहिरा तौर पर क्योंकि मेरे पास NULL कॉलम है, और यह सिर्फ खिड़की के बाहर की अनूठी जाँच करता है
माइकल

ON CONFLICT REPLACEइसका उपयोग करने से सावधान रहें जो आप चाहते हैं वह नहीं हो सकता - यह नई पंक्ति को सम्मिलित करने की अनुमति देने के लिए पहले से मौजूद पंक्तियों को हटा देता है। आम तौर पर, मैं बाधा का उल्लंघन करना या रोकना चाहता हूं। CONFLICT क्लॉज पर SQLite
karmakaze

9

ठीक है, आपका सिंटैक्स आपके द्वारा शामिल लिंक से मेल नहीं खाता, जो निर्दिष्ट करता है:

 CREATE TABLE name (column defs) 
    CONSTRAINT constraint_name    -- This is new
    UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE

मैंने शुरू में ऐसा किया था ... काम नहीं किया। मैंने इसे सिर्फ मामले में फिर से आजमाया ... अभी भी काम नहीं करता है
रिच

1

सावधान रहें कि आप सम्मिलित करने के लिए अलग-अलग परिणाम प्राप्त करने के लिए तालिका को कैसे परिभाषित करेंगे। निम्नलिखित को धयान मे रखते हुए



CREATE TABLE IF NOT EXISTS t1 (id INTEGER PRIMARY KEY, a TEXT UNIQUE, b TEXT);
INSERT INTO t1 (a, b) VALUES
    ('Alice', 'Some title'),
    ('Bob', 'Palindromic guy'),
    ('Charles', 'chucky cheese'),
    ('Alice', 'Some other title') 
    ON CONFLICT(a) DO UPDATE SET b=excluded.b;
CREATE TABLE IF NOT EXISTS t2 (id INTEGER PRIMARY KEY, a TEXT UNIQUE, b TEXT, UNIQUE(a) ON CONFLICT REPLACE);
INSERT INTO t2 (a, b) VALUES
    ('Alice', 'Some title'),
    ('Bob', 'Palindromic guy'),
    ('Charles', 'chucky cheese'),
    ('Alice', 'Some other title');

$ sqlite3 test.sqlite
SQLite version 3.28.0 2019-04-16 19:49:53
Enter ".help" for usage hints.
sqlite> CREATE TABLE IF NOT EXISTS t1 (id INTEGER PRIMARY KEY, a TEXT UNIQUE, b TEXT);
sqlite> INSERT INTO t1 (a, b) VALUES
   ...>     ('Alice', 'Some title'),
   ...>     ('Bob', 'Palindromic guy'),
   ...>     ('Charles', 'chucky cheese'),
   ...>     ('Alice', 'Some other title') 
   ...>     ON CONFLICT(a) DO UPDATE SET b=excluded.b;
sqlite> CREATE TABLE IF NOT EXISTS t2 (id INTEGER PRIMARY KEY, a TEXT UNIQUE, b TEXT, UNIQUE(a) ON CONFLICT REPLACE);
sqlite> INSERT INTO t2 (a, b) VALUES
   ...>     ('Alice', 'Some title'),
   ...>     ('Bob', 'Palindromic guy'),
   ...>     ('Charles', 'chucky cheese'),
   ...>     ('Alice', 'Some other title');
sqlite> .mode col
sqlite> .headers on
sqlite> select * from t1;
id          a           b               
----------  ----------  ----------------
1           Alice       Some other title
2           Bob         Palindromic guy 
3           Charles     chucky cheese   
sqlite> select * from t2;
id          a           b              
----------  ----------  ---------------
2           Bob         Palindromic guy
3           Charles     chucky cheese  
4           Alice       Some other titl
sqlite> 

जबकि सम्मिलित / अद्यतन प्रभाव समान है, idतालिका परिभाषा प्रकार के आधार पर परिवर्तन (दूसरी तालिका देखें जहां 'ऐलिस' अब है id = 4; पहली तालिका जो मैं इसे करने की अपेक्षा करता है, वह अधिक कर रहा है, प्राथमिक कुंजी समान रखें )। इस आशय से अवगत रहें।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.