যে কোনও টেবিলের জন্য বর্তমান AUTO_INCREMENT মান পান


294

আমি কীভাবে মাইএসকিউএলে একটি টেবিলের জন্য বর্তমান অটোপ্রেমেন্ট মান পেতে পারি?


31
এই প্রশ্নটি অবশ্যই একটি সদৃশ নয়। সংযুক্ত প্রশ্নটি সারি গণনার জন্য জিজ্ঞাসা করছে, এবং স্বীকৃত উত্তরটি কেবলমাত্র সারি গণনা পায়, স্বতঃসিদ্ধ নয় - যা সম্পূর্ণ ভিন্ন প্রশ্ন।
মিথাই

উত্তর:


568

আপনি এই কোয়েরিটি ব্যবহার করে টেবিলের সমস্ত ডেটা পেতে পারেন:

SHOW TABLE STATUS FROM `DatabaseName` WHERE `name` LIKE 'TableName' ;

আপনি এই ক্যোয়ারীটি ব্যবহার করে ঠিক এই তথ্যটি পেতে পারেন:

SELECT `AUTO_INCREMENT`
FROM  INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName'
AND   TABLE_NAME   = 'TableName';

34
DATABASE()সুস্পষ্ট ডাটাবেসের নামের পরিবর্তেও ব্যবহার করতে পারে ।
এম। সুলাইমান

22
নোট: ডেটাবেস () শূন্য আপনি একটি ব্যবহার জারি না হয় ডেটাবেস কমান্ড
methai

5
এমন কোন কারণ আছে যা আপনি পারছেন না SELECT MAX(id) FROM table_name?
ব্রায়ান

43
আপনি যদি শেষ রেকর্ডটি মুছে ফেলেন? সর্বোচ্চ আপনাকে বর্তমানের অটো_সংশোধন দেবে না
পিটারপটারসন

3
এটি কি টেবিলের সর্বশেষতম AUTO_INCREMENT মান দেয় বা এনেক্সট মানটি কী হতে চলেছে?
সিডেক্স

18

আমি বিশ্বাস করি আপনি মাইএসকিউএল এর LAST_INSERT_ID () ফাংশনটি সন্ধান করছেন। কমান্ড লাইনে থাকলে, কেবল নিম্নলিখিতটি চালান:

LAST_INSERT_ID();

আপনি এই নির্বাচনটি একটি নির্বাচন জিজ্ঞাসার মাধ্যমেও পেতে পারেন:

SELECT LAST_INSERT_ID();

3
এটিতে একটি যুক্ত করা এবং আশা করা ভাল ধারণা নয়, এটি পরবর্তী সারির আইডি হবে। মাঝামাঝি সময়ে অন্য লেনদেন একটি নতুন সারি couldোকাতে পারে এবং আপনি ভুল আইডিটি সঠিকভাবে ব্যবহার করতে পারবেন?
এগ্রিম

তুমি ঠিক বলছো. আমার ধারণা এটি আপনার যে পরিবেশে চলছে তার উপর নির্ভর করে it's এটি যদি নিয়ন্ত্রিত পরীক্ষার পরিবেশ হয় তবে আপনি সম্ভবত একটি যুক্ত করতে পারেন এবং নিরাপদ থাকতে পারেন be সর্বোত্তম উত্তরটি মেথাই সরবরাহ করেছিলেন।
jvdub

2
সেরা উত্তরটি কী, আপনি কী অর্জন করতে চান তার উপর নির্ভর করে। যদি আপনি একটি নতুন সারি সন্নিবেশ করান এবং আপনি তৈরি করা আইডিটি জানতে চান তবে আপনার উত্তরটি সবচেয়ে ভাল উত্তর, যেহেতু LAST_INSERT_ID () লেনদেন নিরাপদ এবং নিশ্চিত করা হয়েছে, আপনি তৈরি করা সামগ্রীর জন্য আইডি পাবেন get আমি আপনার উত্তরটি ভোট দিয়েছি তবে আমি 'এটিতে একটি যুক্ত করুন ...' দিয়ে অংশটি মুছে
ফেলব

25
LAST_INSERT_ID () প্রতি সংযোগ রয়েছে। তার মানে, যদি অন্য কোনও প্রক্রিয়া আপনার পরে আরও তিনটি অতিরিক্ত সারি সন্নিবেশ করায়, আপনার LAST_INSERT_ID () কলটি তাদের চেয়ে আলাদা হবে। এই প্রশ্নটি টেবিলের মধ্যেই বর্তমান AUTO_INC ভাল জিজ্ঞাসা করছে।
মিথাই

2
যদি সর্বশেষ INSERT বিবৃতিটি একাধিক সারি sertedোকায়, এটি আপনাকে ভুল উত্তর দেবে। মাইএসকিউএল ডকুমেন্টেশন (জোর যোগ করা): "LAST_INSERT_ID () একটি অতিবাহিত INSERT বিবৃতি হিসাবে সফলভাবে একটি AUTO_INCREMENT কলামের জন্য সফলভাবে প্রবেশ করা প্রথম স্বয়ংক্রিয়ভাবে উত্পাদিত মান উপস্থাপন করে একটি 64-বিট মান প্রদান করে।" স্বজ্ঞাত! dev.mysql.com/doc/refman/5.6/en/…
চার্লি

15

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

SHOW CREATE TABLE tablename;

আপনি নীচে অটো_সন্ধি দেখতে হবে


5
আপনার টেবিলে কোনও সারি নেই এবং অটো_সামগ্রীটি চালু থাকলে এটি কাজ করবে বলে মনে হচ্ছে না 1
পেসারিয়ার

6

যদিও আপনি ম্যানুয়ালি নিজেই ক্যোয়ারি চালাচ্ছেন যদি মেথাইয়ের উত্তর সঠিক হয়, তবে সমস্যা হয় যখন 2 সমবর্তী লেনদেন / সংযোগগুলি বাস্তবে উত্পাদনের রানটাইমের সময় এই কোয়েরিটি সম্পাদন করে (উদাহরণস্বরূপ)।

মাইএসকিউএল ওয়ার্কব্যাঞ্চে দু'টি সংযোগের সাথে একই সাথে খোলার চেষ্টা করা হয়েছে:

CREATE TABLE translation (
  id BIGINT PRIMARY KEY AUTO_INCREMENT
);
# Suppose we have already 20 entries, we execute 2 new inserts:

লেনদেন 1:

21 = SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES
     WHERE TABLE_SCHEMA = 'DatabaseName' AND TABLE_NAME = 'translation';

insert into translation (id) values (21);

লেনদেন 2:

21 = SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES
     WHERE TABLE_SCHEMA = 'DatabaseName' AND TABLE_NAME = 'translation';

insert into translation (id) values (21);

# commit transaction 1;
# commit transaction 2;

লেনদেনের সন্নিবেশ 1 ঠিক আছে: লেনদেনের সন্নিবেশ 2 ত্রুটি হয়ে যায়: ত্রুটি কোড: 1062. কী 'PRIMARY' এর জন্য সদৃশ এন্ট্রি '21'।

একটি ভাল সমাধান jvdub এর উত্তর হবে কারণ লেনদেন / সংযোগ প্রতি 2 টি সন্নিবেশক হ'ল :

লেনদেন 1:

insert into translation (id) values (null);
21 = SELECT LAST_INSERT_ID();

লেনদেন 2:

insert into translation (id) values (null);
22 = SELECT LAST_INSERT_ID();

# commit transaction 1;
# commit transaction 2;

তবে sertোকানোর ঠিক পরে আমাদের সর্বশেষ_সাইন্ট_আইডি () চালাতে হবে ! এবং আমরা সেই আইডিটিকে অন্য টেবিলগুলিতে beোকাতে পুনরায় ব্যবহার করতে পারি যেখানে বিদেশী কী প্রত্যাশিত হয়!

এছাড়াও, আমরা নিম্নলিখিত হিসাবে 2 টি ক্যুরিয়ারগুলি কার্যকর করতে পারি না:

insert into translation (id) values ((SELECT AUTO_INCREMENT FROM
    information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE()
    AND TABLE_NAME='translation'));

কারণ আমরা আসলে অন্য টেবিলে সেই আইডি দখল / পুনরায় ব্যবহার করতে বা ফিরে আসতে আগ্রহী!


2
ভাল ব্যাখ্যা! ধন্যবাদ। এটি এখন স্পষ্ট যে আমরা কেন ব্যবহার করতে চাইlast_insert_id()
ইমতিয়াজ

এটি একটি আকর্ষণীয় দৃশ্য, তবে আমি মনে করি না যে এটি আসলে এটির পুনরুদ্ধার করার প্রশ্নের উত্তর দেয় AUTO_INCREMENT
Sharlike

4

mysqli এক্সিকিউটেবল নমুনা কোড:

<?php
    $db = new mysqli("localhost", "user", "password", "YourDatabaseName");
    if ($db->connect_errno) die ($db->connect_error);

    $table=$db->prepare("SHOW TABLE STATUS FROM YourDatabaseName");
    $table->execute();
    $sonuc = $table->get_result();
    while ($satir=$sonuc->fetch_assoc()){
        if ($satir["Name"]== "YourTableName"){
            $ai[$satir["Name"]]=$satir["Auto_increment"];
        }
    }
    $LastAutoIncrement=$ai["YourTableName"];
    echo $LastAutoIncrement;
?>  

1

যদি কলামটি স্কেল সার্ভারে স্বতঃসংশোধিত হয় তবে বর্তমান স্বয়ত্তিবোধক মানটি দেখতে এবং যদি আপনি এই কলামটির জন্য সেই মানটি সম্পাদনা করতে চান তবে নীচের ক্যোয়ারীটি ব্যবহার করুন।

-- to get current value
select ident_current('Table_Name')

-- to update current value
dbcc checkident ('[Table_Name]',reseed,"Your Value")

1

একটি প্রদত্ত স্কিমা ( সমস্ত স্বাক্ষরযুক্ত টাইপযুক্ত কলাম বাদে ) সমস্ত টেবিলের জন্য আউটপুট ক্রিমেন্টের শতাংশ "ব্যবহার" পরীক্ষা করার জন্য জিজ্ঞাসা :

SELECT 
  c.TABLE_NAME,
  c.COLUMN_TYPE,
  c.MAX_VALUE,
  t.AUTO_INCREMENT,
  IF (c.MAX_VALUE > 0, ROUND(100 * t.AUTO_INCREMENT / c.MAX_VALUE, 2), -1) AS "Usage (%)" 
FROM 
  (SELECT 
     TABLE_SCHEMA,
     TABLE_NAME,
     COLUMN_TYPE,
     CASE 
        WHEN COLUMN_TYPE LIKE 'tinyint(1)' THEN 127
        WHEN COLUMN_TYPE LIKE 'tinyint(1) unsigned' THEN 255
        WHEN COLUMN_TYPE LIKE 'smallint(%)' THEN 32767
        WHEN COLUMN_TYPE LIKE 'smallint(%) unsigned' THEN 65535
        WHEN COLUMN_TYPE LIKE 'mediumint(%)' THEN 8388607
        WHEN COLUMN_TYPE LIKE 'mediumint(%) unsigned' THEN 16777215
        WHEN COLUMN_TYPE LIKE 'int(%)' THEN 2147483647
        WHEN COLUMN_TYPE LIKE 'int(%) unsigned' THEN 4294967295
        WHEN COLUMN_TYPE LIKE 'bigint(%)' THEN 9223372036854775807
        WHEN COLUMN_TYPE LIKE 'bigint(%) unsigned' THEN 0
        ELSE 0
     END AS "MAX_VALUE" 
   FROM 
     INFORMATION_SCHEMA.COLUMNS
     WHERE EXTRA LIKE '%auto_increment%'
   ) c

   JOIN INFORMATION_SCHEMA.TABLES t ON (t.TABLE_SCHEMA = c.TABLE_SCHEMA AND t.TABLE_NAME = c.TABLE_NAME)

WHERE
 c.TABLE_SCHEMA = 'YOUR_SCHEMA' 
ORDER BY
 `Usage (%)` DESC;

0

আমি এটির সন্ধান করছি এবং হেল্পার শ্রেণীর অভ্যন্তরে একটি স্থিতিশীল পদ্ধতি তৈরি করে শেষ করেছি (আমার ক্ষেত্রে আমি এটিকে অ্যাপ \ সহায়তাকারী \ ডাটাবেস নামকরণ করেছি)।

পদ্ধতি

/**
 * Method to get the autoincrement value from a database table
 *
 * @access public
 *
 * @param string $database The database name or configuration in the .env file
 * @param string $table    The table name
 *
 * @return mixed
 */
public static function getAutoIncrementValue($database, $table)
{
    $database ?? env('DB_DATABASE');

    return \DB::select("
        SELECT AUTO_INCREMENT 
        FROM information_schema.TABLES 
        WHERE TABLE_SCHEMA = '" . env('DB_DATABASE') . "' 
        AND TABLE_NAME = '" . $table . "'"
    )[0]->AUTO_INCREMENT;
}

পদ্ধতিটি কল করতে এবং মাইএসকিউএল আউটপুট ক্রিমেন্টটি পেতে কেবল নিম্নলিখিতটি ব্যবহার করুন:

$auto_increment = \App\Helpers\Database::getAutoIncrementValue(env('DB_DATABASE'), 'your_table_name');

আশা করি এটা সাহায্য করবে.

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