วิธีรับ id ถัดไปใน mysql เพื่อแทรกในตาราง
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
วิธีรับ id ถัดไปใน mysql เพื่อแทรกในตาราง
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
คำตอบ:
ใช้LAST_INSERT_ID()
จากแบบสอบถาม SQL ของคุณ
หรือ
คุณยังสามารถใช้mysql_insert_id()
เพื่อรับมันโดยใช้ PHP
LAST_INSERT_ID()
ที่คุณกล่าวว่าการกล่าวขวัญ
mysqli_insert_id
คุณสามารถใช้ได้
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
หรือหากคุณไม่ต้องการใช้ information_schema คุณสามารถใช้สิ่งนี้ได้
SHOW TABLE STATUS LIKE 'table_name'
TABLES.AUTO_INCREMENT
ถูกแคช dev.mysql.com/doc/refman/8.0/en/... MySQL บล็อกนอกจากนี้ยังมีการโพสต์หลายประการเกี่ยวกับมัน แต่ varaible ระบบที่พวกเขาพูดถึงดูเหมือนว่าล้าสมัย: mysqlserverteam.com/... mysqlserverteam.com/...
คุณสามารถรับค่าการเพิ่มอัตโนมัติครั้งถัดไปได้โดยทำดังนี้
SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'
โปรดทราบว่าคุณไม่ควรใช้สิ่งนี้เพื่อแก้ไขตารางให้ใช้คอลัมน์ auto_increment เพื่อทำสิ่งนั้นโดยอัตโนมัติแทน
ปัญหาคือlast_insert_id()
มีผลย้อนหลังและสามารถรับประกันได้ภายในการเชื่อมต่อปัจจุบัน
ทารกคนนี้มีความคาดหวังดังนั้นจึงไม่ซ้ำกันต่อการเชื่อมต่อและไม่สามารถพึ่งพาได้
ในฐานข้อมูลการเชื่อมต่อเดียวเท่านั้นที่จะใช้งานได้ แต่ฐานข้อมูลการเชื่อมต่อเดียวในปัจจุบันมีนิสัยที่จะกลายเป็นฐานข้อมูลการเชื่อมต่อหลายรายการในวันพรุ่งนี้
insert into table_name (field1, field2) select 'constant', auto_increment from information_schema.tables where table_name = 'table_name'
? ฉันจะใช้การอัปเดตในafter insert
ทริกเกอร์และlast_insert_id()
แม้ว่า ...
UPDATE
ถ้าฉันมีด้วย แต่ฉันอยากจะเชื่อมทั้งสองอย่างเข้าด้วยกันในเวลาแสดงผลและช่วยประหยัดความยุ่งยากทั้งหมด
SHOW TABLE STATUS
คาดว่าจะเห็นdatabase name
หลังFROM
และหลัง'table name pattern'
LIKE
สิ่งนี้จะคืนค่าการเพิ่มอัตโนมัติสำหรับฐานข้อมูล MySQL และฉันไม่ได้ตรวจสอบกับฐานข้อมูลอื่น โปรดทราบว่าหากคุณกำลังใช้ฐานข้อมูลอื่นไวยากรณ์การสืบค้นอาจแตกต่างกัน
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();
คำตอบด้านบนใช้ PHP MySQL_สำหรับโซลูชันคิดว่าฉันจะแชร์โซลูชันPHP MySQLi_ ที่อัปเดตเพื่อให้บรรลุสิ่งนี้ ไม่มีผลลัพธ์ข้อผิดพลาดใน exmaple นี้!
$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'];
เริ่มต้นการเพิ่มอัตโนมัติครั้งถัดไปในตาราง
ใน PHP คุณสามารถลองสิ่งนี้:
$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;
"DataBaseName" คือชื่อฐานข้อมูลของเรา
แบบสอบถามง่ายๆจะทำ
SHOW TABLE STATUS LIKE 'table_name'
คุณสามารถใช้ทริกเกอร์ mysql
payment_code
ในafter insert
ทริกเกอร์ดูเหมือนจะเป็นตัวเลือกที่ดีที่สุด
คุณไม่สามารถใช้ ID ในขณะที่แทรกได้และคุณไม่จำเป็นต้องใช้ MySQL ไม่ทราบ ID ด้วยซ้ำเมื่อคุณกำลังแทรกระเบียนนั้น คุณเพียงแค่สามารถบันทึก"sahf4d2fdd45"
ในpayment_code
ตารางและการใช้งานid
และpayment_code
ในภายหลัง
หากคุณต้องการให้ payment_code ของคุณมี ID อยู่จริงๆให้อัปเดตแถวหลังแทรกเพื่อเพิ่ม ID
information_schema.tables
ตาราง
SELECT ... CONCAT(payment_code, id)
หรือในรหัสแอปพลิเคชันของคุณ คุณสามารถรวมเข้าSELECT
ใน a VIEW
เพื่อให้คุณคืนค่าที่ถูกต้องได้เสมอโดยไม่ต้องกังวลเกี่ยวกับ CONCAT ในทุก SELECT จากแอปของคุณ
คุณต้องการ ID ที่เพิ่มขึ้นต่อไปสำหรับอะไร?
MySQL อนุญาตให้เพิ่มเขตข้อมูลอัตโนมัติได้เพียงช่องเดียวต่อตารางและต้องเป็นคีย์หลักเพื่อรับประกันความเป็นเอกลักษณ์
โปรดทราบว่าเมื่อคุณได้รับรหัสแทรกถัดไปอาจไม่สามารถใช้ได้เมื่อคุณใช้เนื่องจากมูลค่าที่คุณมีอยู่ภายในขอบเขตของธุรกรรมนั้นเท่านั้น ดังนั้นขึ้นอยู่กับการโหลดบนฐานข้อมูลของคุณค่านั้นอาจถูกใช้ไปแล้วเมื่อมีการร้องขอครั้งต่อไป
ฉันขอแนะนำให้คุณตรวจสอบการออกแบบของคุณเพื่อให้แน่ใจว่าคุณไม่จำเป็นต้องรู้ว่าจะกำหนดค่าการเพิ่มอัตโนมัติใดต่อไป
ฉันขอแนะนำให้คิดใหม่ว่าคุณกำลังทำอะไรอยู่ ฉันไม่เคยมีประสบการณ์การใช้งานเพียงครั้งเดียวที่จำเป็นต้องมีความรู้พิเศษนั้น รหัสถัดไปเป็นรายละเอียดการใช้งานที่พิเศษมากและฉันจะไม่นับว่าจะได้รับ ACID อย่างปลอดภัย
ทำธุรกรรมง่ายๆเพียงรายการเดียวซึ่งอัปเดตแถวที่คุณแทรกด้วยรหัสสุดท้าย:
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 และเลือกฐานข้อมูลก่อนจึงจะทำได้
$table_name = "myTable";
$query = mysql_query("SHOW TABLE STATUS WHERE name='$table_name'");
$row = mysql_fetch_array($query);
$next_inc_value = $row["AUTO_INCREMENT"];
ใช้ "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 Hash เช่น:
INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( getAutoincrementalNextval ('document') ),
'Title',
'Body'
);
การปรับปรุง @ ravi404 ในกรณีที่การชดเชยการเพิ่มอัตโนมัติของคุณไม่ใช่ 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): ดูเหมือนว่าเครื่องยนต์ db จะพิจารณาค่าชดเชยเป็น 1 ดังนั้นคุณต้องทิ้งสมมติฐานนี้จากนั้นเพิ่มค่าทางเลือกของ @@ auto_increment_offset หรือค่าเริ่มต้นเป็น 1: IFNULL (@@ auto_increment_offset, 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 ที่ไม่ถูกต้องให้ลอง:
ANALYZE TABLE `my_table`;
SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE (TABLE_NAME = 'my_table');
ล้างแคชสำหรับตารางใน BD
auto_increment
คอลัมน์