একযোগে উপস্থিত না থাকলে sertোকান


13

আমার সঞ্চিত পদ্ধতিতে আমার সন্নিবেশগুলির সাথে একযোগে সমস্যা হচ্ছে। পদ্ধতির প্রাসঙ্গিক অংশটি হ'ল:

select @_id = Id from table1 where othervalue = @_othervalue
IF( @_id IS NULL)
BEGIN
    insert into table1 (othervalue) values (@_othervalue)
    select @_id = Id from table1 where othervalue = @_othervalue
END

যখন আমরা এই সঞ্চিত প্রকল্পের একযোগে 3 বা 4 চালাই আমরা উপলক্ষ্যে একাধিক সন্নিবেশ পাই।

আমি এইভাবে ঠিক করার পরিকল্পনা করছি:

insert into table1 (othervalue) 
    select TOP(1) @_othervalue as othervalue from table1 WITH(UPDLOCK) 
    where NOT EXISTS ( select * from table1 where othervalue = @_othervalue )

select @_id = Id from table1 where othervalue = @_othervalue

প্রশ্নটি হল, এসকিএল সার্ভারে ডুপ্লিকেট ছাড়াই একসাথে কীভাবে সন্নিবেশ করা যায়? আমাকে কেবল একবার ব্যাঘাত ঘটাতে শীর্ষস্থান ব্যবহার করতে হবে তা এই সত্য।


1
আপনাকে টপ ব্যবহার করতে হবে না। নির্বাচনী বিবৃতি থেকে FROM সারণী রেফারেন্স সরান।
এরিক


@ জিসার্গ আমি আপনাকে সঠিক বলে মনে করি।
ক্রিস

উত্তর:


7

আপনি serializableইঙ্গিত সহ একীভূত বিবৃতি ব্যবহার করতে পারেন ।

merge table1 with (serializable) as T 
using (select @_othervalue as othervalue) as S
on T.othervalue = S.othervalue
when not matched then
  insert (othervalue) values (othervalue);

আপনি দুটি বা আরও সংযোগ থেকে আপনার পদ্ধতির পরীক্ষা করেছেন?
একে

2
@ অ্যালেক্সকুজনসভ - এসও সম্পর্কিত আরও একটি প্রশ্নের জন্য আমি কিছুক্ষণ আগে এটি করেছি। আমি এসএসএমএসে দুটি ট্যাব ব্যবহার করেছি। প্রথমে insert ... where not exist ...প্যাটার্নটি পরীক্ষা করে দেখা গেছে যে আপনি ডেডলকস এবং কী লঙ্ঘন পেতে পারেন তাই সেখানে আপডেটলক এবং সিরিয়ালাইজযোগ্য ব্যবহার করা প্রয়োজন। আমি তখন মার্জ স্টেটমেন্টটি পরীক্ষা করেছিলাম এবং ভেবেছিলাম এটি কিছুটা ভালভাবে পরিচালনা করবে এবং এটি হয়েছে কারণ সেখানে কোনও অচলাবস্থা নেই তবে কী কী লঙ্ঘন না করার জন্য আমাকে এখনও সিরিয়ালাইজযোগ্য ব্যবহার করতে হয়েছিল।
মিকেল এরিকসন

1
এটি সত্যিই দুর্দান্ত উত্তর।
ক্রিস মেরিসিক

5

আপনি যদি 'অন্যান্যমূল্য' কলামে নকল করতে না চান, আপনি unique constraintসেই কলামটিতে একটি তৈরি করে এটি করতে পারেন । ক্যোয়ারীটি হ'ল:

 ALTER TABLE table1
 ADD CONSTRAINT unique_c_othervalue UNIQUE(othervalue)

যদি কোনও কোয়েরি 'অন্য মূল্য' কলামে সদৃশ মান inোকানোর চেষ্টা করে তবে এটি একটি ত্রুটি ফিরিয়ে আনবে।


কীভাবে কাজ করবে যদি অনন্য সীমাবদ্ধতা দুটি সারি টিউপল হয়?
ক্রিস

1
@ ক্রিস কীভাবে আপনার এক অনন্য বাধা আছে যা সারিগুলিকে বিস্তৃত করে?
অ্যারন বারট্র্যান্ড

অ্যারন আমার সম্ভবত আমার পরিভাষা বন্ধ আছে তবে আমাদের দুটি সারি রয়েছে যা একসাথে অনন্য হওয়া দরকার। আমি মনে করি না এটি আমাদের স্কিমাতে প্রয়োগ করা হয়েছে।
ক্রিস

2

@ স্ট্যানলি জনসের পরামর্শ অনুসারে একটি অনন্য বাধা ব্যবহার করুন। তারপরে আপনার sertোকানো স্টেটমেন্টের চারপাশে শুরু করুন ব্যবহারের চেষ্টা করুন।

select @_id = Id from table1 where othervalue = @_othervalue
IF( @_id IS NULL)
BEGIN
    BEGIN TRY
        insert into table1 (othervalue) values (@_othervalue)
        select @_id = Id from table1 where othervalue = @_othervalue        
    END TRY
    BEGIN CATCH
        select @_id = Id from table1 where othervalue = @_othervalue        
    END CATCH
END
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.