মাইএসকিএল সন্নিবেশ জিজ্ঞাসা থেকে নতুন রেকর্ড প্রাথমিক কী আইডি পাবেন?


249

ঠিক আছে, তাই বলে আমি মাইএসকিউএল করছি দেয় INSERTআমার টেবিল এক পরিণত এবং সারণি কলামে হয়েছে item_idযা সেট করা হয় autoincrementএবং primary key

item_idএকই ক্যোয়ারীতে সদ্য উত্পন্ন প্রাথমিক কীটির মান আউটপুট দেওয়ার জন্য আমি কীভাবে প্রশ্নটি পেতে পারি ?

বর্তমানে আইডিটি পুনরুদ্ধার করার জন্য আমি একটি দ্বিতীয় ক্যোয়ারী চালিয়ে যাচ্ছি তবে এটির পক্ষে খুব ভাল অনুশীলন মনে হচ্ছে এটি ভুল ফলাফল হতে পারে ...

যদি এটি সম্ভব না হয় তবে আমি সঠিক আইডিটি পুনরুদ্ধার করার জন্য সর্বোত্তম অনুশীলন কী?


1
এর INSERTমতো কোনও ক্যোয়ারী থেকে কোনও কিছুই ফেরার উপায় নেই ; কেন আপনি মনে করেন যে এটির ভুল ফলাফল হতে পারে?
বিস্ফোরণ বড়ি

4
ঠিক আছে, যদি প্রক্রিয়াটি 2 জন ব্যক্তি দ্বারা পৃথকভাবে সম্পাদন করা হয় তবে আপনি একটি ওভারল্যাপিং প্রক্রিয়া তালিকা পেতে পারেন আমার মনে হয় - যেহেতু আপনাকে 2 টি পৃথক অনুসন্ধান চালাতে হবে?
অ্যামি নেভিল


@ জিমফেল হ্যাঁ এটি মূলত একই প্রশ্ন, তবে সাধারণভাবে এটির আরও ভাল উত্তর রয়েছে
রোজা

1
পোস্টগ্র্যাসকিএল ব্যবহার করুন তারপরে এই INSERT INTO টেবিলের মতো করুন (কল 1, কল 2) ভলিউস (ভাল 1, ভাল 2) রিটার্নিং আইডি বা সন্নিবেশ INTO টেবিল (কল 1, কল 2) ভ্যালু (ভাল 1, ভাল 2) রিটার্নিং * বা আপডেট টেবিল সেট কল 1 = ভাল 1, কল 2 = ভাল 2 বিবৃতি রিটার্নিং আইডি বা আপডেট টেবিল সেট (কল 1, কল 2) = (ভাল 1, ভাল 2) যেখানে বিবৃতি রিটার্নিং আইডি বা আপডেট টেবিল সেট (কল 1, কল 2) = (ভাল 1, ভাল 2) যেখানে বিবৃতি প্রত্যাবর্তন করছে *
gdarcan

উত্তর:


327

আপনাকে এই LAST_INSERT_ID()ফাংশনটি ব্যবহার করতে হবে: http://dev.mysql.com/doc/refman/5.0/en/information-function.html#function_last-insert-id

উদাহরণ:

INSERT INTO table_name (col1, col2,...) VALUES ('val1', 'val2'...);
SELECT LAST_INSERT_ID();

এই আপনি ফেরত পেতে হবে PRIMARY KEYযে গত সারির মান আপনি সন্নিবেশিত:

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

সুতরাং দ্বারা ফিরে মান LAST_INSERT_ID()ব্যবহারকারী প্রতি এবং অপ্রভাবিত যে সার্ভারে চলমান করা যেতে পারে অন্য প্রশ্নের দ্বারা অন্যান্য ব্যবহারকারীদের কাছ থেকে


8
হ্যাঁ তবে কী হবে যদি অন্তর্বর্তীকালীন (প্রক্রিয়া তালিকার প্রশ্নের মধ্যে) অন্য কিছু সারি ?োকানো হয়েছে? সন্নিবেশ ক্যোয়ারী লেখার কোনও উপায় আছে যাতে এটি আউটপুট হয়?
অ্যামি নেভিল

ঠিক আছে, আমি দেখছি ... ফলাফলটির লগ না করা সত্ত্বেও ক্যোয়ারির শেষ সন্নিবেশ আইডি রেকর্ড করা হয়েছে ... $ mysqli-> insert_id
অ্যামি নেভিল

27
এই আপনি ফেরত পেতে হবে PRIMARY KEYযে গত সারির মান আপনি সার্ভারে প্রতিটি সংযোগ এটা এই জন্য নিজের মান বজায় রাখা হবে - ঢোকানো, কারণ এটি সংযোগ প্রতি আছে। আমি এটি পরিষ্কার করতে উত্তর আপডেট করেছি।
ডানকান লক

সুতরাং ধরুন 3 জন ব্যবহারকারী একই সাথে তাদের ফর্মগুলি পোস্ট করেছেন এবং আমার ডাটাবেসগুলিতে সেগুলি প্রবেশ করতে হবে। আমি টেবিল 2 এ টেবিল 1 এর প্রতিটি নির্মিত নতুন আইডি সম্পর্কিত একটি সারি যুক্ত করতে চাই। সামঞ্জস্যতা কি যত্ন নেওয়া হয়েছে বা আসন্ন ডাটাবেস লেখার অনুরোধের জন্য আমাকে পিএইচপি-তে ম্যানুয়ালি তা করতে হবে?
খারাপ_কিপয়েন্ট

আপনি যদি টেবিল 1 সন্নিবেশ করান এমন বিন্দুটিতে, ডাটাবেসটি টেবিল 2-এ সন্নিবেশ করতে চাইবে এমন সমস্ত তথ্য জানে, তবে আপনি এটি করতে ট্রিগার ব্যবহার করতে পারেন, বা এটি একটি কোয়েরিতে একত্রিত করতে পারেন। যদি তা না হয়, তবে আপনাকে একাধিক ক্যোয়ারী ব্যবহার করতে হবে - যেমন পিএইচপি-তে এটি করুন। এটি ডেটা কী এবং এটি দ্বিতীয় সন্নিবেশের জন্য কোথা থেকে আসছে তা নির্ভর করে।
ডানকান লক

21

সাবধান !! "LAST_INSERT_ID ()" এর যদি পিএইচপি-র মধ্যে এই প্রাথমিক কী মানটি ফেরত দেওয়ার চেষ্টা করা হয় of

আমি জানি এই থ্রেডটি পিএইচপিকে ট্যাগ করা নেই, তবে যে কেউ এই উত্তরটি পেরিয়ে এসেছেন তার জন্য পিএইচপি স্ক্রিপ্টেড সন্নিবেশ আইডি থেকে একটি মাইএসকিউএল সন্নিবেশ আইডিটি স্ট্যান্ডার্ড মাইএসকিএল_কিউরি কলগুলি ব্যবহার করে ফিরে যেতে চেয়েছেন - এটি কাজ করবে না এবং এসকিউএল ত্রুটিগুলি ক্যাপচার না করে সুস্পষ্ট নয়।

নতুন মাইসকিলি একাধিক ক্যোয়ারিকে সমর্থন করে - যা LAST_INSERT_ID () আসলে আসল থেকে দ্বিতীয় কোয়েরি।

সর্বশেষ প্রাথমিক কীটি সনাক্ত করতে আইএমও একটি পৃথক নির্বাচন করুন INচ্ছিক mysql_insert_id () ফাংশনটির চেয়ে আগের INSERT অপারেশন থেকে উত্পন্ন আউটপুট ক্রিমেন্ট আইডি ফিরিয়ে দেওয়ার চেয়ে নিরাপদ।


7
LAST_INSERT_IDপ্রতি সংযোগ মাইএসকিউএল ফাংশন। আপনি যদি সর্বশেষ সন্নিবেশ আইডির জন্য জিজ্ঞাসা করেন তবে এটি সম্ভবত একটি পৃথক সংযোগ একটি লিখন সম্পাদন করবে এবং আপনার ভুল আইডি থাকবে।
বিস্ফোরণ পিলস

@ExplosionPills mysql_insert_id()একটি প্রতি সংযোগ ভিত্তিতে কাজ করে, কিন্তু এটি অদ্ভুত আচরণের যেমন এখানে দেখা ভুগছেন stackoverflow.com/a/897374/1305910 Cliffordlife দ্বারা মন্তব্যে - কিছু মনে করবেন না আমরা সবাই ব্যবহার হওয়া উচিত ছিলmysqli
RozzA

আপনি যখন 'এটি কাজ করবে না' তখন আপনি কী বোঝাতে চেয়েছিলেন তা কি আপনি পরিষ্কার করতে পারেন?
জন কেটজিক

18

LAST_INSERT_ID()ডকুমেন্টেশন থেকে :

উত্পন্ন আইডি সার্ভারে প্রতি সংযোগের ভিত্তিতে রক্ষণ করা হয়

এটি যদি আপনার স্ক্রিপ্টে একই সাথে দুটি পৃথক অনুরোধ থাকে তবে তারা একে অপরকে প্রভাবিত করবে না LAST_INSERT_ID()(যদি না আপনি সম্ভবত অবিচ্ছিন্ন সংযোগ ব্যবহার করছেন)।


2
আমার মনে হয় এটা সন্দেহজনক হলে আপনার টেবিল যে অন্য টেবিল মধ্যে একটি সন্নিবেশ করে এটি একটি ট্রিগার হয়েছে .... LAST_INSERT_ID () অন্যান্য টেবিলের আইডি মান ফিরে আসবে ..
bgies

15

এখানে আপনি যা খুঁজছেন !!!

select LAST_INSERT_ID()

এটি SCOPE_IDENTITY()ব্যবহৃত হচ্ছে ফাংশনের সেরা বিকল্প SQL Server

আপনার এও মনে রাখা দরকার যে এটি কেবল তখনই কাজ করবে যদি Last_INSERT_ID()আপনার Insertজিজ্ঞাসা অনুসরণ করে বরখাস্ত করা হয় । এটি হল ক্যোয়ারি স্কিমে sertedোকানো আইডি ফেরত দেয়। আপনি নির্দিষ্ট সারণির সর্বশেষ sertedোকানো আইডি পেতে পারবেন না।

আরও তথ্যের জন্য দয়া করে লিঙ্কটি দেখুন মাইএসকিউএলে এসকিউএল সার্ভার ফাংশন SCOPE_IDENTITY () এর সমতুল্য?


6

একটি সারি সন্নিবেশ করার আগে যদি মানটির প্রয়োজন হয়:

CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
    RETURNS BIGINT
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN

    DECLARE Value BIGINT;

    SELECT
        AUTO_INCREMENT INTO Value
    FROM
        information_schema.tables
    WHERE
        table_name = TableName AND
        table_schema = DATABASE();

    RETURN Value;

END

আপনি এটি একটি sertোকাতে ব্যবহার করতে পারেন:

INSERT INTO
    document (Code, Title, Body)
VALUES (                
    sha1( concat (convert ( now() , char), ' ',   getAutoincrementalNextval ('document') ) ),
    'Title',
    'Body'
);

1
এই এক ভাল ধারণা বলে মনে হচ্ছে না? যদি 2 ক্লায়েন্ট একই সময়ে সেই ফাংশনটিতে কল করেন তবে তারা ভাবেন যে তারা বাস্তবে তারা না থাকলে একই আইডিটি সন্নিবেশ করছিল .... কেউ sertোকাতে কিছুটা ধীর হয়ে যাবে এবং এটি না জেনে পরবর্তী আইডি পাবে।
কারকার

5

আপনি আপনার প্রশ্নের ফলাফল এই পরামিতি পাবেন:

    "fieldCount": 0,
    "affectedRows": 1,
    "insertId": 66,
    "serverStatus": 2,
    "warningCount": 1,
    "message": "",
    "protocol41": true,
    "changedRows": 0

insertIdঠিক কি আপনি প্রয়োজন।

(NodeJS-MySQL)


4

পাইথন যদি পাইমিস্কল ব্যবহার করে তবে কার্সার থেকে আপনি কার্সারটি ব্যবহার করতে পারেন last স্ট্রয়েড


2

কেবল "$ শেষ_আইডি = mysqli_insert_id ($ সংযোগ) ব্যবহার করুন;"


2
আমি গুগলের জন্য ধন্যবাদ এই উত্তরটির পিএইচপি সংস্করণ সন্ধান করতে এখানে আসলে হোঁচট খেয়েছি, তাই আমি এই উত্তরটি ভোট দিয়েছি। যদিও প্রযুক্তিগতভাবে ওপি পিএইচপি জিজ্ঞাসা করেনি, এটি এখানে প্রচুর লোকের পক্ষেও সহায়ক হতে পারে।
ফটোগ্রাফার ব্রিট

আপনাকে অনেক ধন্যবাদ অর্নভ! আমি
জুয়ানসেদানো

1

আপনি যদি পিএইচপি ব্যবহার করছেন: পিডিও অবজেক্টে আপনি সহজেই inোকানোর পরে লাস্ট ইনসার্ট আইডি পদ্ধতিতে আবেদন করতে পারেন ।

অন্যথায় একটি LAST_INSERT_ID দিয়ে আপনি এর মতো মান পেতে পারেন:SELECT LAST_INSERT_ID();



0

আমি এই বিষয়ে আমার দৃষ্টিভঙ্গিটি পিএইচপি-তে কেবল ভাগ করতে চাই, আপনারা কেউ কেউ এটি একটি কার্যকর উপায় হিসাবে নাও পেলেন তবে এটি অন্যান্য উপলব্ধ বিকল্পগুলির চেয়ে 100 গুণ ভাল।

একটি এলোমেলো কী তৈরি করুন এবং এটি একটি নতুন সারি তৈরি করে টেবিলের মধ্যে সন্নিবেশ করুন। তারপরে আপনি কীটি প্রাথমিক কীটি পুনরুদ্ধার করতে ব্যবহার করতে পারেন। ডেটা যুক্ত করতে এবং অন্যান্য স্টাফ করতে আপডেটটি ব্যবহার করুন।

এইভাবে করা সারি সুরক্ষিত করতে এবং সঠিক প্রাথমিক কীটি রাখতে সহায়তা করে।

আপনার যদি অন্য কোনও বিকল্প না থাকে তবে আমি সত্যিই এটির প্রস্তাব দিচ্ছি না।

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