Cách lấy id tiếp theo trong mysql để chèn nó vào bảng
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Cách lấy id tiếp theo trong mysql để chèn nó vào bảng
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Câu trả lời:
Sử dụng LAST_INSERT_ID()
từ truy vấn SQL của bạn.
Hoặc là
Bạn cũng có thể sử dụng mysql_insert_id()
để lấy nó bằng PHP.
LAST_INSERT_ID()
.
mysqli_insert_id
Bạn có thể dùng
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
hoặc nếu bạn không muốn sử dụng information_schema, bạn có thể sử dụng
SHOW TABLE STATUS LIKE 'table_name'
TABLES.AUTO_INCREMENT
này được lưu trong bộ nhớ cache dev.mysql.com/doc/refman/8.0/en/… . Blog Mysql cũng có một số bài đăng về nó, nhưng hệ thống có thể sử dụng được mà họ đề cập có vẻ lỗi thời: mysqlserverteam.com/… mysqlserverteam.com/…
Bạn có thể nhận được giá trị tự động tăng tiếp theo bằng cách thực hiện:
SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'
Lưu ý rằng bạn không nên sử dụng điều này để thay đổi bảng, thay vào đó hãy sử dụng cột auto_increment để làm điều đó tự động.
Vấn đề là đó last_insert_id()
là hồi cứu và do đó có thể được đảm bảo trong kết nối hiện tại.
Em bé này có triển vọng và do đó không phải là duy nhất cho mỗi kết nối và không thể dựa vào.
Chỉ trong một cơ sở dữ liệu kết nối duy nhất thì nó mới hoạt động, nhưng các cơ sở dữ liệu kết nối đơn ngày nay có thói quen trở thành nhiều cơ sở dữ liệu kết nối vào ngày mai.
Xem: SHOW TABLE STATUS
insert into table_name (field1, field2) select 'constant', auto_increment from information_schema.tables where table_name = 'table_name'
nào? Tôi sẽ sử dụng cập nhật trong after insert
kích hoạt và last_insert_id()
, mặc dù ...
UPDATE
nếu tôi cũng vậy. Nhưng tôi chỉ muốn kết hợp cả hai tại thời điểm hiển thị và tiết kiệm mọi rắc rối.
SHOW TABLE STATUS
mong đợi để xem database name
sau FROM
và 'table name pattern'
sau LIKE
.
Điều này sẽ trả về giá trị tăng tự động cho cơ sở dữ liệu MySQL và tôi đã không kiểm tra với các cơ sở dữ liệu khác. Xin lưu ý rằng nếu bạn đang sử dụng bất kỳ cơ sở dữ liệu nào khác, thì cú pháp truy vấn có thể khác.
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();
Câu trả lời hàng đầu sử dụng PHP MySQL_ cho một giải pháp, tôi nghĩ rằng tôi sẽ chia sẻ một giải pháp PHP MySQLi_ được cập nhật để đạt được điều này. Không có lỗi đầu ra trong bản đồ này!
$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'];
Bắt đầu gia số Tự động tiếp theo sắp xuất hiện trong bảng.
Trong PHP, bạn có thể thử điều này:
$query = mysql_query("SELECT MAX(id) FROM `your_table_name`");
$results = mysql_fetch_array($query);
$cur_auto_id = $results['MAX(id)'] + 1;
HOẶC LÀ
$result = mysql_query("SHOW TABLE STATUS WHERE `Name` = 'your_table_name'");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];
Giải pháp:
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" là tên của Cơ sở dữ liệu của chúng tôi
Bạn có thể sử dụng trình kích hoạt mysql
payment_code
trong trình after insert
kích hoạt dường như là lựa chọn tốt nhất.
Bạn không thể sử dụng ID trong khi chèn, bạn cũng không cần nó. MySQL thậm chí không biết ID khi bạn đang chèn bản ghi đó. Bạn chỉ có thể lưu "sahf4d2fdd45"
trong payment_code
bảng và sử dụng id
và payment_code
sau này.
Nếu bạn thực sự cần mã thanh toán của mình để có ID trong đó thì hãy CẬP NHẬT hàng sau phần chèn để thêm ID.
information_schema.tables
bảng.
SELECT ... CONCAT(payment_code, id)
hoặc trong mã ứng dụng của bạn. Bạn thậm chí có thể bọc SELECT
trong một VIEW
, để bạn luôn trả về giá trị phù hợp mà không phải lo lắng về CONCAT trong mỗi lần CHỌN từ ứng dụng của bạn.
Bạn cần ID gia tăng tiếp theo để làm gì?
MySQL chỉ cho phép một trường tăng tự động trên mỗi bảng và nó cũng phải là khóa chính để đảm bảo tính duy nhất.
Lưu ý rằng khi bạn nhận được ID chèn tiếp theo, nó có thể không khả dụng khi bạn sử dụng vì giá trị bạn có chỉ nằm trong phạm vi của giao dịch đó. Do đó, tùy thuộc vào tải trên cơ sở dữ liệu của bạn, giá trị đó có thể đã được sử dụng vào thời điểm yêu cầu tiếp theo đến.
Tôi khuyên bạn nên xem lại thiết kế của mình để đảm bảo rằng bạn không cần biết giá trị tăng tự động nào sẽ chỉ định tiếp theo
Tôi đề nghị suy nghĩ lại những gì bạn đang làm. Tôi chưa bao giờ trải qua một trường hợp sử dụng duy nhất nào mà kiến thức đặc biệt đó được yêu cầu. Id tiếp theo là một chi tiết triển khai rất đặc biệt và tôi sẽ không tính đến việc nhận được nó là ACID an toàn.
Thực hiện một giao dịch đơn giản cập nhật hàng đã chèn của bạn với id cuối cùng:
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;
sử dụng "mysql_insert_id ()". mysql_insert_id () hoạt động trên truy vấn được thực hiện gần đây nhất, hãy nhớ gọi mysql_insert_id () ngay sau khi truy vấn tạo ra giá trị.
Dưới đây là ví dụ sử dụng:
<?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());
?>
Tôi hy vọng ví dụ trên là hữu ích.
mysql_insert_id();
Đó là nó :)
SELECT id FROM `table` ORDER BY id DESC LIMIT 1
Mặc dù tôi nghi ngờ về năng suất của nó nhưng nó đáng tin cậy 100%
sử dụng câu trả lời của 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
sử dụng trong truy vấn chèn của bạn, để tạo SHA1 Hash. Ví dụ.:
INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( getAutoincrementalNextval ('document') ),
'Title',
'Body'
);
Cải tiến của @ ravi404, trong trường hợp bù đắp tự động của bạn KHÔNG PHẢI là 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): công cụ db dường như sẽ cân nhắc mức bù là 1. Vì vậy, bạn cần loại bỏ giả định này, sau đó thêm giá trị tùy chọn của @@ auto_increment_offset hoặc mặc định thành 1: IFNULL (@@ auto_increment_offset, 1)
Đối với tôi, nó hoạt động và trông đơn giản:
$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
lặp đi lặp lại khi bạn có thể DESC
. while
Khối của bạn đã làm vô số công việc vô ích.
auto_increment
cột