Як отримати наступний 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 також є кілька публікацій про це, але система, що їх згадує, вважається застарілою: 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()
це ретроспектива і, таким чином, можна гарантувати в межах поточного з'єднання.
Ця дитина перспективна, тому не є унікальною за з'єднання, і на неї не можна покластися.
Лише в одній базі даних з'єднань вона працювала б, але одиничні бази даних сьогодні мають звичку завтра ставати декількома базами з'єднань.
Побачити: SHOW TABLE STATUS
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_ для досягнення цього. У цьому прикладі немає помилок!
$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" - це назва нашої бази даних
Ви можете використовувати тригер mysql
payment_code
в after insert
тригері , здається, найкращий варіант.
Ви не можете використовувати ідентифікатор під час вставки, і він вам не потрібен. MySQL навіть не знає ідентифікатора, коли ви вставляєте цю запис. Ви можете просто зберегти "sahf4d2fdd45"
в payment_code
таблиці та використовувати id
та payment_code
пізніше.
Якщо вам дійсно потрібен ваш код_плати, щоб у ньому був ідентифікатор, то ОБНОВЛИТИ рядок після вставки для додавання ідентифікатора.
information_schema.tables
таблиці.
SELECT ... CONCAT(payment_code, id)
кодом, або у коді програми. Ви навіть можете обернути це SELECT
в а VIEW
, щоб ви завжди повертали потрібне значення, не турбуючись про CONCAT у кожному SELECT зі свого додатка.
Для чого вам потрібен наступний додатковий ідентифікатор?
MySQL дозволяє лише одне поле з автоматичним збільшенням на кожну таблицю, і воно також повинно бути первинним ключем для гарантування унікальності.
Зауважте, що коли ви отримуєте наступний ідентифікатор вставки, він може бути недоступний при його використанні, оскільки значення, яке ви маєте, знаходиться лише в межах цієї транзакції. Тому залежно від завантаження вашої бази даних, це значення може бути використане до моменту надходження наступного запиту.
Я б запропонував переглянути ваш дизайн, щоб переконатися, що вам не потрібно знати, яке значення автоматичного збільшення потрібно призначити наступним
Я пропоную переосмислити те, що ви робите. Я ніколи не стикався з одним випадком використання, коли потрібні спеціальні знання. Наступний ідентифікатор - це дуже особлива деталь реалізації, і я не розраховував би на те, щоб це було безпечним для кислоти.
Зробіть одну просту транзакцію, яка оновлює вставлений рядок з останнім ідентифікатором:
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. напр .:
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
стовпчик