এসকিউএলাইটে "উপস্থিত না থাকলে sertোকান" বিবৃতি


143

আমার একটি এসকিউএল ডাটাবেস আছে। আমি টেবিলের মধ্যে মানগুলি ( users_id, lessoninfo_id) সন্নিবেশ করানোর চেষ্টা করছি bookmarks, কেবলমাত্র যদি উভয়ই পরপর না থাকে।

INSERT INTO bookmarks(users_id,lessoninfo_id) 
VALUES(
    (SELECT _id FROM Users WHERE User='"+$('#user_lesson').html()+"'),
        (SELECT _id FROM lessoninfo 
        WHERE Lesson="+lesson_no+" AND cast(starttime AS int)="+Math.floor(result_set.rows.item(markerCount-1).starttime)+") 
        WHERE NOT EXISTS (
            SELECT users_id,lessoninfo_id from bookmarks 
            WHERE users_id=(SELECT _id FROM Users 
            WHERE User='"+$('#user_lesson').html()+"') AND lessoninfo_id=(
                SELECT _id FROM lessoninfo
                WHERE Lesson="+lesson_no+")))

এটি বলে একটি ত্রুটি দেয়:

সিনট্যাক্সের নিকটে ডিবি ত্রুটি।

উত্তর:


138

আপনার কাছে মেমোস নামে একটি সারণী রয়েছে যার দুটি কলাম রয়েছে idএবং textআপনার এটি করতে সক্ষম হওয়া উচিত:

INSERT INTO memos(id,text) 
SELECT 5, 'text to insert' 
WHERE NOT EXISTS(SELECT 1 FROM memos WHERE id = 5 AND text = 'text to insert');

যদি কোনও রেকর্ডটিতে ইতিমধ্যে এমন একটি সারি থাকে যেখানে text'পাঠানো থেকে সন্নিবেশকরণ' এর idসমান এবং 5 এর সমান হয়, তবে সন্নিবেশ ক্রিয়াকলাপটি উপেক্ষা করা হবে।

আমি জানি না এটি আপনার নির্দিষ্ট প্রশ্নের জন্য কাজ করবে কিনা তবে সম্ভবত এটি কীভাবে এগিয়ে যেতে হবে তার একটি ইঙ্গিত দেয়।

আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি তার পরিবর্তে আপনার টেবিলটি ডিজাইন করুন যাতে @CLs answerনীচে বর্ণিত কোনও অনুলিপি অনুমোদিত না হয় ।


436

যদি আপনি কখনই সদৃশ করতে চান না, আপনি এটি একটি টেবিল সীমাবদ্ধতা হিসাবে ঘোষণা করতে হবে:

CREATE TABLE bookmarks(
    users_id INTEGER,
    lessoninfo_id INTEGER,
    UNIQUE(users_id, lessoninfo_id)
);

(উভয় কলামের একটি প্রাথমিক কী একই প্রভাব ফেলবে))

এরপরে ডাটাবেসটিকে বলা সম্ভব যে আপনি নীরবে এইরকম সীমাবদ্ধতা লঙ্ঘনকারী রেকর্ডগুলি উপেক্ষা করতে চান :

INSERT OR IGNORE INTO bookmarks(users_id, lessoninfo_id) VALUES(123, 456)

12
সদ্য sertedোকানো সারি বা ইতিমধ্যে বিদ্যমান একটির আইডি পাওয়ার সর্বোত্তম উপায় কী, তাই আমি এটি অন্য টেবিলে inোকাতে পারি যার একটিতে বিদেশী কী রয়েছে? যেমন আমার দুটি টেবিল রয়েছে person (id, name unique)এবং cat (person_id, name unique)আমি প্রচুর জোড় inোকাতে চাই (person_name, cat_name)?
অর সরফ

2
বিদ্যমান সারিটির আইডি পড়া কেবলমাত্র একটি নির্বাচন জিজ্ঞাসা দিয়ে সম্ভব। তবে এটি ভিন্ন প্রশ্ন।
সিএল

1
সম্ভবত যোগ ON CONFLICT IGNOREকরা CREATE TABLEকিছুটা সহজ হতে পারে
ডিফ্ল্ট করুন

1
@ rightaway717 "উপেক্ষা করুন" এর অর্থ হ'ল কিছুই হয় না; আপডেট করার সাথে এই প্রশ্নের কোনও সম্পর্ক নেই।
সিএল

1
@ হ্যাক06 অ্যান্ড্রয়েডের সন্নিবেশ () আলাদা আচরণ করে; আপনার এটি insertOrThrow () বা insertWithOnConflict () দিয়ে প্রতিস্থাপন করা উচিত ।
সিএল

21

একটি অনন্য কলামের জন্য, এটি ব্যবহার করুন:

INSERT OR REPLACE INTO table () values();

আরও তথ্যের জন্য, দেখুন: sqlite.org/lang_insert


এটি আমার পক্ষে কাজ করে না। এটি সর্বদা সন্নিবেশ করায় বা সারণী হিসাবে প্রতিস্থাপন করে my_table (কল 1, কল 2) মান ('1', '2'); 1 2 এর একাধিক সারি যুক্ত করবে
পিটার মুর

আমি যুক্ত করতে পারি যে এই সীমাবদ্ধতাটি যদি রাখে তবে এটি ভাল কাজ করে Unique(col1,col2)এবং আপনার কাছে কল 3ও রয়েছে, কারণ কোনও সন্নিবেশ বা উপেক্ষা করলে ব্যর্থ হবে যেখানে এটি কোল 3কে নতুন মান আপডেট করবে। insert or replace into my_table values('1','2','5')একটি সারি প্রতিস্থাপন'1','2','3'
পিটার মুর

4
insert into bookmarks (users_id, lessoninfo_id)

select 1, 167
EXCEPT
select user_id, lessoninfo_id
from bookmarks
where user_id=1
and lessoninfo_id=167;

এটি সবচেয়ে দ্রুততম উপায়।

অন্য কয়েকটি এসকিউএল ইঞ্জিনের জন্য, আপনি একটি রেকর্ডযুক্ত একটি ডামি টেবিল ব্যবহার করতে পারেন। উদাহরণ:

select 1, 167 from ONE_RECORD_DUMMY_TABLE
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.