মাইএসকিউএল এর LAST_INSERT_ID () ফাংশনটি কি সঠিক হওয়ার গ্যারান্টিযুক্ত?


36

যখন আমি INSERTএকটি টেবিলের একক সারি করি যার AUTO_INCREMENTকলাম রয়েছে আমি সেই সারিটির জন্য সঞ্চিত LAST_INSERT_ID()নতুন AUTO_INCREMENT'এড মানটি ফিরিয়ে দিতে ফাংশনটি ব্যবহার করতে চাই ।

অনেকগুলি মাইক্রোসফ্ট এসকিউএল সার্ভার ডেভস এবং অ্যাডমিনরা সন্দেহ নেই যে এসকিউএল সার্ভারের সমতুল কার্যকারিতাটি সচেতন ( SCOPE_IDENTITYএবং @@IDENTITY) এর সমস্যাগুলি ছাড়াই হয়নি ।

আমি মাইএসকিউএল ডক্সের অবস্থা জানি:

উত্পন্ন আইডি সার্ভারে প্রতি সংযোগের ভিত্তিতে রক্ষণ করা হয় । এর অর্থ এই যে একটি প্রদত্ত ক্লায়েন্ট ফাংশন দ্বারা ফিরে মান প্রথম AUTO_INCREMENTসাম্প্রতিকতম একটি প্রভাবিত বিবৃতি জন্য উত্পন্ন মান AUTO_INCREMENTকলাম যে ক্লায়েন্ট দ্বারা । এই মানটি অন্য ক্লায়েন্টদের দ্বারা প্রভাবিত হতে পারে না, এমনকি যদি তারা AUTO_INCREMENTনিজস্ব মান তৈরি করে। এই আচরণটি নিশ্চিত করে যে প্রতিটি ক্লায়েন্ট অন্যান্য ক্লায়েন্টের ক্রিয়াকলাপের জন্য উদ্বেগ ছাড়াই এবং তালা বা লেনদেনের প্রয়োজন ছাড়াই নিজের আইডি পুনরুদ্ধার করতে পারে।

(সূত্র)

এমনকি এমনকি যতদূর বলতে যান:

একাধিক ক্লায়েন্টের একসাথে ব্যবহার LAST_INSERT_ID()এবং AUTO_INCREMENTকলামগুলি পুরোপুরি বৈধ।

(সূত্র)

এমন কোনও ঝুঁকি বা পরিস্থিতি রয়েছে যা LAST_INSERT_ID()সঠিক মান না ফেরানোর কারণ হতে পারে ?

আমি সেন্টস 5.5 এক্স 64 এবং ফেডোরা 16 x64 এবং ইনোডিবি ইঞ্জিনে মাইএসকিউএল 5.5 ব্যবহার করছি।

উত্তর:


35

একটি দম্পতি সতর্কতা অবলম্বন করতে চাই যখন আমি ব্যবহার করব LAST_INSERT_ID:

  1. আমি জানি আপনি একক-সারি সন্নিবেশ উল্লেখ করেছেন। তবে একাধিক সারি সন্নিবেশ LAST_INSERT_ID()করানোর সময় সন্নিবেশ করা প্রথম সারির মানটি (শেষ নয়) ফিরিয়ে দেবে।

  2. যদি সন্নিবেশ ব্যর্থ হয় LAST_INSERT_ID()তবে অপরিজ্ঞাত হবে। লেনদেনের স্বয়ংক্রিয় রোলব্যাকগুলির জন্য একই (ত্রুটির কারণে) true

  3. আপনি একটি লেনদেন যে সফল একটি সন্নিবেশ না, এবং আপনি এখনও একটি ইস্যু যদি ROLLBACK, LAST_INSERT_ID()যেমন রোলব্যাক করার পূর্বে ছিল বাম করা হবে।

  4. আছে একটি দম্পতি আদেশ সহকারে ব্যবহার করে যখন AUTO_INCREMENTএবং LAST_INSERT_IDবিবৃতি ভিত্তিক রেপ্লিকেশন হবে। ট্রিগার বা ফাংশনে ব্যবহৃত হওয়ার পরে প্রথমটি। দ্বিতীয়টি হ'ল কম-সাধারণ পরিস্থিতি যেখানে আপনার অটো_সামগ্রী কলামটি একটি যৌগিক প্রাথমিক কী এর অংশ এবং এটি কীটির প্রথম কলাম নয়।


7

ডিটিস্টের দেওয়া উত্তরে ২ নম্বর পয়েন্টে আরও প্রসারিত করতে:

আমি যে মাইএসকিউএল ব্যবহার করেছি তার সংস্করণগুলিতে, আপনি যে কোনও সন্নিবেশ সম্পাদন করার পরিকল্পনা করছেন সেখানে কোডের প্রতিটি ব্লকের আগে LAST_INSERT_ID এর মান স্পষ্টতা পুনরায় সেট করা ভাল ধারণা ।

এটি এর মতো করা যেতে পারে:

-- initialize the LAST_INSERT_ID to some flag value:
SELECT LAST_INSERT_ID( some_flag_init_value_of_your_choice );
-- perform the insert  
INSERT INTO ttt (ccc) VALUES (vvv);
-- retrieve the id of the inserted row:  
SELECT LAST_INSERT_ID();

উপরোক্ত সিরিজের বিবৃতি কার্যকর করার পরে, আপনি জানতে পারবেন যে LAST_INSERT_ID এখনও মৃত্যুদন্ডের শেষে "কিছু_ফ্ল্যাগ_নিট_ভ্যালু_ও_আপনার পছন্দ" সেট করা আছে কিনা তা পরীক্ষা করে byোকানোটি কোনও প্রভাব ফেলেছিল কিনা।

অন্যথায়, আপনি নিম্নলিখিত সমস্যাযুক্ত পরিস্থিতিটি শেষ করতে পারেন:

INSERT INTO ttt ( ccc ) VALUES ( 'a' );    -- assume this succeeds.
SELECT LAST_INSERT_ID();                   -- this will return the unique id of the new row with value 'a'.
INSERT INTO ttt ( ccc ) VALUES ( 'b' );    -- assume this FAILS.
SELECT LAST_INSERT_ID();                   -- this will STILL RETURN the unique id of the row with 'a'.

দ্বিতীয় সন্নিবেশ ব্যর্থ হয়েছে বলে আপনি আশা করছেন যে LAST_INSERT_ID- এ দ্বিতীয় কলটি হয় NULL প্রত্যাবর্তন করবে বা এটি একটি খালি ফলাফল সেট (শূন্য সারি) তৈরি করবে। এটি এখনও একটি বৈধ পূর্ণসংখ্যার শনাক্তকারীকে ফেরত দেওয়ার বিষয়টি আপনাকে এই ভ্রান্তিতে ভ্রান্ত করতে পারে যে দ্বিতীয় সন্নিবেশটি যখন তা না হয় তখন সফল হয় না।

বিষয়গুলি পূর্ব ওয়েইনার হয়ে যায় যখন আপনি বিবেচনা করেন যে LAST_INSERT_ID শেষ সফল অনন্য আইডি সংরক্ষণ এবং পুনরাবৃত্তি করতে থাকবে এমনকি যদি পরবর্তী ব্যর্থ সন্নিবেশ বিবৃতিগুলি সর্বশেষ সফল অনন্য আইডি উত্পাদনকারী সারণীর তুলনায় বিভিন্ন সারণিকে লক্ষ্য করে চলেছে। অন্য কথায়, আপনি টেবিল টিএতে সন্নিবেশ করান এবং 5 এর আইডি পান, তারপরে আপনি টিবিতে প্রবেশ করান (তবে এটি ব্যর্থ হয়) তবে আপনি এখনও একটি 5 দেখতে পাচ্ছেন that এর ভিত্তিতে, আপনি মনে করেন যে আপনি টিএতে সবে একটি নতুন সারি তৈরি করেছেন 5 আইডি সহ এবং 5 এর আইডি সহ টিবি একটি নতুন সারি, যেহেতু বাস্তবে সেখানে পারেন কোনো সারি টিবি মধ্যে ID 5 বিদ্যমান নয়, অথবা যেমন একটি সারি অস্তিত্ব কিন্তু এটা আসলে কোন কোড আপনি শুধু সঙ্গে কিছুই করার আছে দৌড়ে।


2
প্রথমদিকে আপনার last_insert_id()জিজ্ঞাসাটি সফল হয়েছিল কিনা তা বিচার করার জন্য আপনার অস্তিত্ব ব্যবহার করা উচিত হয়নি । এটি সর্বশেষে প্রবেশ করা আইডি, আপনার প্রয়োজনীয় মানগুলি ধারণ করে যখন আপনি ইতিমধ্যে জানতেন যে আপনি সফল হয়েছেন।
পেসারিয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.