এটি সারণীতে সন্নিবেশ করানোর জন্য কীভাবে পরবর্তী আইডিটি মাইএসকিএলে পাবেন
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
এটি সারণীতে সন্নিবেশ করানোর জন্য কীভাবে পরবর্তী আইডিটি মাইএসকিএলে পাবেন
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
উত্তর:
LAST_INSERT_ID()আপনার এসকিউএল কোয়েরি থেকে ব্যবহার করুন ।
অথবা
আপনি mysql_insert_id()পিএইচপি ব্যবহার করে এটি পেতে ব্যবহার করতে পারেন।
LAST_INSERT_ID()।
mysqli_insert_id
তুমি ব্যবহার করতে পার
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
অথবা আপনি যদি তথ্য_সেমিমা ব্যবহার করতে না চান তবে আপনি এটি ব্যবহার করতে পারেন
SHOW TABLE STATUS LIKE 'table_name'
TABLES.AUTO_INCREMENT ক্যাশে করা এই অফিশিয়াল ডক স্টেট । মাইএসকিএল ব্লগেরও এটি সম্পর্কে বেশ কয়েকটি পোস্ট রয়েছে তবে তারা যে সিস্টেমটি উল্লেখ করেছেন তা পরিবর্তনযোগ্য বলে মনে হচ্ছে: mysqlserverteam.com/… mysqlserverteam.com/…
আপনি এটি করে পরবর্তী অটো-ইনক্রিমেন্ট মান পেতে পারেন :
SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'
মনে রাখবেন যে টেবিলটি পরিবর্তন করতে আপনার এটি ব্যবহার করা উচিত নয় , পরিবর্তে স্বয়ংক্রিয়ভাবে এটি করার জন্য একটি অটো_সংশোধক কলাম ব্যবহার করুন।
সমস্যাটি হ'ল last_insert_id()পূর্ববর্তী এবং এটি বর্তমান সংযোগের মধ্যে গ্যারান্টিযুক্ত হতে পারে।
এই শিশুটি সম্ভাব্য এবং তাই সংযোগ অনুযায়ী অনন্য নয় এবং নির্ভর করা যায় না।
কেবলমাত্র একটি একক সংযোগের ডেটাবেজে এটি কাজ করবে তবে একক সংযোগের ডেটাবেজে আজ কাল একাধিক সংযোগ ডাটাবেস হওয়ার অভ্যাস রয়েছে।
দেখা: SHOW TABLE STATUS
insert into table_name (field1, field2) select 'constant', auto_increment from information_schema.tables where table_name = 'table_name'? আমি after insertlast_insert_id()
UPDATEযদি পরে থাকতাম তবে আমি বরং প্রদর্শনের সময় দু'জনকেই সম্মতি জানাতে এবং সমস্ত ঝামেলা বাঁচাতে চাই।
SHOW TABLE STATUSদেখতে আশা database nameপর FROMএবং 'table name pattern'পরে LIKE।
এটি মাইএসকিউএল ডাটাবেসের জন্য স্বয়ংক্রিয় বর্ধন মানটি ফিরিয়ে দেবে এবং আমি অন্যান্য ডাটাবেসের সাথে পরীক্ষা করিনি। দয়া করে মনে রাখবেন যে আপনি যদি অন্য কোনও ডাটাবেস ব্যবহার করেন তবে ক্যোয়ারের বাক্য গঠনটি ভিন্ন হতে পারে।
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'your_table_name'
and table_schema = 'your_database_name';
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'your_table_name'
and table_schema = database();
শীর্ষের উত্তরটি একটি সমাধানের জন্য পিএইচপি মাইএসকিউএল_ ব্যবহার করে, ভেবেছিলাম আমি এটি অর্জনের জন্য একটি আপডেট হওয়া পিএইচপি মাইএসকিউএল_ সমাধানটি ভাগ করব । এই এক্সপামলটিতে কোনও ত্রুটি আউটপুট নেই!
$db = new mysqli('localhost', 'user', 'pass', 'database');
$sql = "SHOW TABLE STATUS LIKE 'table'";
$result=$db->query($sql);
$row = $result->fetch_assoc();
echo $row['Auto_increment'];
একটি টেবিলের মধ্যে আগত পরবর্তী অটো বর্ধন শুরু করে।
পিএইচপি-তে আপনি এটি ব্যবহার করতে পারেন:
$query = mysql_query("SELECT MAX(id) FROM `your_table_name`");
$results = mysql_fetch_array($query);
$cur_auto_id = $results['MAX(id)'] + 1;
অথবা
$result = mysql_query("SHOW TABLE STATUS WHERE `Name` = 'your_table_name'");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];
সমাধান:
CREATE TRIGGER `IdTrigger` BEFORE INSERT ON `payments`
FOR EACH ROW
BEGIN
SELECT AUTO_INCREMENT Into @xId
FROM information_schema.tables
WHERE
Table_SCHEMA ="DataBaseName" AND
table_name = "payments";
SET NEW.`payment_code` = CONCAT("sahf4d2fdd45",@xId);
END;
"ডাটাবেসনেম" আমাদের ডেটা বেসের নাম
আপনি মাইএসকিএল ট্রিগার ব্যবহার করতে পারেন
payment_codeমধ্যে after insertট্রিগার সবচেয়ে ভাল বিকল্প মনে করা হয়।
Serোকানোর সময় আপনি আইডি ব্যবহার করতে পারবেন না, আপনার এটিরও দরকার নেই। আপনি যখন এই রেকর্ডটি সন্নিবেশ করছিলেন তখন মাইএসকিউএল এমনকি আইডিও জানেন না। আপনি শুধু বাঁচাতে পারে "sahf4d2fdd45"মধ্যে payment_codeটেবিল এবং ব্যবহার idএবং payment_codeপরে।
আইডি রাখতে আপনার যদি আপনার পেমেন্ট_ কোডটি সত্যই প্রয়োজন হয় তবে আইডি যুক্ত করতে সন্নিবেশের পরে সারিটি আপডেট করুন।
information_schema.tablesসারণীতে তালিকাভুক্ত ।
SELECT ... CONCAT(payment_code, id)বা আপনার অ্যাপ্লিকেশন কোডে। এমনকি আপনি মোড়ানো পারে SELECTএকটি VIEW, যাতে আপনি সবসময় সঠিক মান, আপনার অ্যাপ্লিকেশন থেকে নির্বাচন করুন CONCAT সম্পর্কে উদ্বেজক ছাড়া।
আপনার পরবর্তী ইনক্রিমেন্টাল আইডি কী দরকার?
মাইএসকিউএল প্রতি টেবিলের জন্য কেবল একটি অটো-ইনক্রিমেন্ট ক্ষেত্রের অনুমতি দেয় এবং স্বতন্ত্রতার গ্যারান্টি দেওয়ার জন্য এটি প্রাথমিক কীও হতে হবে।
নোট করুন যে আপনি যখন পরবর্তী সন্নিবেশ আইডিটি পাবেন তখন এটি যখন আপনি এটি ব্যবহার করবেন না তখন আপনার কাছে থাকা মানটি কেবলমাত্র সেই লেনদেনের আওতায় থাকে। সুতরাং আপনার ডাটাবেসের লোডের উপর নির্ভর করে, পরবর্তী অনুরোধটি আসার আগেই সেই মানটি ইতিমধ্যে ব্যবহার করা যেতে পারে।
আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি নিজের নকশাটি পর্যালোচনা করুন তা নিশ্চিত করার জন্য আপনাকে পরবর্তী কোন অটো-ইনক্রিমেন্ট মান নির্ধারণ করতে হবে তা নিশ্চিত হওয়ার দরকার নেই
আপনি যা করছেন তা পুনর্বিবেচনা করার পরামর্শ দিই। আমি কখনও একক ব্যবহারের ক্ষেত্রে অভিজ্ঞতা পাইনি যেখানে সেই বিশেষ জ্ঞানের প্রয়োজন। পরের আইডিটি একটি বিশেষ প্রয়োগের বিশদ এবং এটি এসিডি নিরাপদ হওয়ার বিষয়ে আমি বিশ্বাস করি না।
একটি সাধারণ লেনদেন করুন যা আপনার প্রবেশকৃত সারিটি শেষ আইডির সাথে আপডেট করে:
BEGIN;
INSERT INTO payments (date, item, method)
VALUES (NOW(), '1 Month', 'paypal');
UPDATE payments SET payment_code = CONCAT("sahf4d2fdd45", LAST_INSERT_ID())
WHERE id = LAST_INSERT_ID();
COMMIT;
"mysql_insert_id ()" ব্যবহার করুন। mysql_insert_id () সর্বশেষ সঞ্চালিত ক্যোয়ারিতে কাজ করে, মান উত্পন্ন করে এমন ক্যোয়ারির অবিলম্বে mysql_insert_id () কল করতে ভুলবেন না।
নীচে ব্যবহারের উদাহরণ:
<?php
$link = mysql_connect('localhost', 'username', 'password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');
mysql_query("INSERT INTO mytable VALUES('','value')");
printf("Last inserted record has id %d\n", mysql_insert_id());
?>
আমি আশা করি উপরের উদাহরণটি দরকারী।
mysql_insert_id();
এটাই :)
SELECT id FROM `table` ORDER BY id DESC LIMIT 1
যদিও আমি এর উত্পাদনশীলতায় সন্দেহ করি তবে এটি 100% নির্ভরযোগ্য
ravi404 এর উত্তর ব্যবহার করে:
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
আপনার সন্নিবেশ ক্যোয়ারী ব্যবহার করে একটি SHA1 হ্যাশ তৈরি করতে। প্রাক্তন .:
INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( getAutoincrementalNextval ('document') ),
'Title',
'Body'
);
@ রবি 404 এর উন্নতি, যদি আপনার স্বতঃসংশোধনের অফসেটটি 1 না হয়:
SELECT (`auto_increment`-1) + IFNULL(@@auto_increment_offset,1)
FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = your_table_name
AND table_schema = DATABASE( );
( auto_increment-1): ডিবি ইঞ্জিনটি অ্যালওয়াসকে 1 এর অফসেট হিসাবে বিবেচনা করবে বলে মনে হয় তাই আপনাকে এই অনুমানটি খনন করতে হবে, তারপরে autoচ্ছিক মান = অটো_সংশোধন_অফসেট, বা ডিফল্ট 1 এ যুক্ত করুন: আইএফএনএলএল (@ অটো_সংশ্লিষ্ট_অফसेट, 1)
আমার জন্য এটি কার্যকর হয় এবং সহজ দেখাচ্ছে:
$auto_inc_db = mysql_query("SELECT * FROM my_table_name ORDER BY id ASC ");
while($auto_inc_result = mysql_fetch_array($auto_inc_db))
{
$last_id = $auto_inc_result['id'];
}
$next_id = ($last_id+1);
echo $next_id;//this is the new id, if auto increment is on
$last_idযখন আপনি ঠিক করতে পারেন পুনরাবৃত্তিমূলকভাবে নির্ধারণ করা বেশ অপ্রয়োজনীয় DESC। আপনার whileব্লকটি প্রচুর অকেজো কাজের কাজ করেছে।
auto_incrementকলাম ব্যবহার করুন