SQLite সারণি সীমাবদ্ধ - একাধিক কলামে অনন্য on


179

এসকিউএলাইট ওয়েবসাইটে আমি এটিতে সিনট্যাক্স "চার্ট" খুঁজে পেতে পারি, তবে কোনও উদাহরণ এবং আমার কোড ক্রাশ হচ্ছে না। আমার একক কলামে অনন্য বাধা সহ অন্যান্য সারণী রয়েছে তবে আমি দুটি কলামে টেবিলটিতে একটি সীমাবদ্ধতা যুক্ত করতে চাই। এটি আমার কাছে যা একটি "এসকিউএলএক্সেপশন" বার্তাটি "সিনট্যাক্স ত্রুটি" দিয়ে তৈরি করছে।

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

আমি নিম্নলিখিতগুলির উপর ভিত্তি করে এটি করছি:

সারণীর-বাধ্যতা

পরিষ্কার হওয়ার জন্য, আমি যে লিঙ্কটি সরবরাহ করেছি তাতে ডকুমেন্টেশনগুলি বলে যে এটি CONTSTRAINT nameআমার সীমাবদ্ধ সংজ্ঞাটির আগে আসা উচিত।

সমাধানের দিকে পরিচালিত করতে পারে এমন কিছু যা আমার প্রথম বন্ধনীযুক্ত কলাম সংজ্ঞা অনুসরণ করে যা ডিবাগার তার অভিযোগ করে।

যদি আমি রাখি

...last_column_name last_col_datatype) CONSTRAINT ...

ত্রুটিটি "চুক্তি" -এর কাছাকাছি: সিনট্যাক্স ত্রুটি

যদি আমি রাখি

...last_column_name last_col_datatype) UNIQUE ...

ত্রুটিটি "UNIQUE" এর কাছাকাছি: সিনট্যাক্স ত্রুটি


1
ইউনিকউ এটির শুরু হওয়ার আগে একটি কমা হারিয়েছে ..
মজিদ বশির

উত্তর:


344

অনন্য ঘোষণাটি কলাম সংজ্ঞা বিভাগের মধ্যে রাখুন; কাজের উদাহরণ:

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

6
ভাল উত্তর +1। এটি কি সিনট্যাক্স তৈরি করে আমাকে নিয়মিত সন্নিবেশ পদ্ধতিটি ব্যবহার করার অনুমতি দেয় এবং এসকিউএলডিটাবেস.সনএফএলিকT_REPLACE পতাকা সহ insertWithOnConflict না?
ওলেগ বেলোসভ

3
আমি ON CONFLICT IGNORE2 টিরও বেশি কলাম সহ (এখনও প্রতিস্থাপনের চেষ্টা করিনি) ব্যবহার করছি , তবে আমি এটি অনন্য প্রতিবন্ধকে সম্মান দেখছি না, এটি কেবল আনন্দের সাথে নকলগুলি যুক্ত করেছে।
মাইকেল 0

5
স্পষ্টতই কারণ আমার কাছে নুল কলাম রয়েছে এবং এটি কেবল উইন্ডোটি অনন্য চেক করে ফেলেছে
মাইকেল

ON CONFLICT REPLACEএটি ব্যবহারে সাবধান থাকুন আপনি যা চান তা নাও হতে পারে - এটি নতুন সারিটি সন্নিবেশ করার জন্য পূর্ব-বিদ্যমান সারিগুলি মুছে দেয়। সাধারণত, আমি আবর্জনা বা সীমাবদ্ধতা লঙ্ঘন করতে চাই।
এসকিউএলাইট

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; প্রথম টেবিলটি আমি যা প্রত্যাশা করি তার থেকে আরও বেশি করে চলছে, প্রাথমিক কী একইভাবে রাখুন )। এই প্রভাব সম্পর্কে সচেতন হন।


1

আপনার যদি ইতিমধ্যে একটি টেবিল থাকে এবং যে কোনও কারণেই এটি পুনরায় তৈরি করতে / না করতে চাইলে, সূচকগুলি ব্যবহার করুন :

CREATE UNIQUE INDEX my_index ON my_table(col_1, col_2);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.