18 ответов:
использовать
LAST_INSERT_ID()из вашего SQL-запроса.или
вы также можете использовать
mysql_insert_id()чтобы получить его с помощью PHP.
можно использовать
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'table_name' AND table_schema = DATABASE( ) ;или если вы не хотите использовать information_schema вы можете использовать это
SHOW TABLE STATUS LIKE 'table_name'
Вы можете узнать далее значение автоматического приращения, выполнив:
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()является ретроспективным и, таким образом, может быть гарантировано в текущем соединении.
Этот ребенок является перспективным и поэтому не является уникальным для каждого соединения и не может быть положен.
Только в одной базе данных связи будет ли это работать, но базы данных с одним соединением сегодня имеют привычку становиться несколькими базами данных соединений завтра.
в 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'];
в верхнем ответе используется 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'];выбивает следующее автоматическое приращение, появляющееся в таблице.
это вернет авто значение для базы данных MySQL и я не проверял с другими базами данных. Обратите внимание, что при использовании любой другой базы данных синтаксис запроса может отличаться.
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'your_table_name' and table_schema = database();
устранение:
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 триггер
вы не можете использовать идентификатор при вставке, не нужно. MySQL даже не знает ID, когда вы вставляете эту запись. Вы могли бы просто сохранить
"sahf4d2fdd45"наpayment_codeтаблицы и использоватьidиpayment_codeпозже.Если вам действительно нужен ваш payment_code, чтобы иметь идентификатор в нем, то обновите строку после вставки, чтобы добавить идентификатор.
для чего вам нужен следующий инкрементный идентификатор?
MySQL позволяет только одно поле автоматического приращения на таблицу, и оно также должно быть первичным ключом, чтобы гарантировать уникальность.
обратите внимание, что при получении следующего идентификатора вставки он может быть недоступен при его использовании, поскольку значение, которое у вас есть, находится только в пределах этой транзакции. Поэтому в зависимости от нагрузки на базу данных, это значение может быть уже использован следующий запрос.
I было бы предложено пересмотреть свой дизайн, чтобы убедиться, что вам не нужно знать, какое значение автоматического приращения назначить далее
вы должны подключиться к 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"];
Я предлагаю переосмыслить то, что вы делаете. Я никогда не испытывал ни одного случая использования, когда требуются эти специальные знания. Следующий идентификатор-это очень специальная деталь реализации, и я бы не рассчитывал на то, что он безопасен для кислоты.
сделайте одну простую транзакцию, которая обновляет вставленную строку с последним идентификатором:
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()); ?>Я надеюсь, что приведенный выше пример полезен.
SELECT id FROM `table` ORDER BY id DESC LIMIT 1хотя я сомневаюсь в его продуктивности, но это 100% Надежный
используя ответ рави404:
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 engine, кажется, alwaus рассматривает смещение 1. Поэтому вам нужно отбросить это предположение, а затем добавить необязательное значение @@auto_increment_offset или по умолчанию 1: IFNULL (@@auto_increment_offset,1)
Comments