|
|
|
| есть функция mysql_insert_id() она возвращает ID, сгенерированный колонкой с AUTO_INCREMENT последним запросом INSERT к серверу,
А есть ли подобие функции, только которая выводит последний id (можно и после последнего), только до записи в БД.
Тоесть мне надо получить номер id в который будет записаны данные, только получить его до записи данных!
Подскажите кто знает! | |
|
|
|
|
|
|
|
для: dima_s_d_s
(14.01.2007 в 21:18)
| | Нельзя так делать. Представьте ситуацию. Есть скрипт, который должен вставить запись по предугаданному ID. Один юзер запустил его, скрипт выдал ID = 10, второй пользователь запустил его и опять ID = 10. Первый пользователь вставил данные с ID = 10, а что делать второму? =( Правильно ничего не остаётся, как перезапускать скрипт и ещё раз пытаться добавить запись =). | |
|
|
|
|
|
|
|
для: dima_s_d_s
(14.01.2007 в 21:18)
| | SELECT MAX(id) FROM table; | |
|
|
|
|
|
|
|
для: Саня
(14.01.2007 в 21:25)
| | это совсем не то | |
|
|
|
|
|
|
|
для: Sergey89
(14.01.2007 в 21:30)
| | Для таких целей надо использовать сввязку INSERT, SELECT, UPDATE. | |
|
|
|
|
|
|
|
для: Sergey89
(14.01.2007 в 21:33)
| | Вы, видно, не очень понимаете принцип работы auto_increment. Своим запросом я получу id последней существующей записи. Следовательно следующий id будет свободен. | |
|
|
|
|
|
|
|
для: Саня
(14.01.2007 в 21:48)
| | В своём первом посте я описал суть проблеммы. | |
|
|
|
|
|
|
|
для: Sergey89
(14.01.2007 в 21:49)
| | А LOCK TABLES для чего придуман? | |
|
|
|
|
|
|
|
для: Саня
(14.01.2007 в 21:48)
| | Нет. Это ID может быть занять копией запущенного скрипта. | |
|
|
|
|
|
|
|
для: Sergey89
(14.01.2007 в 21:51)
| | Опять же, см. LOCK TABLES. | |
|
|
|
|
|
|
|
для: Саня
(14.01.2007 в 21:53)
| | Если вы заблокируете таблицу, другой пользователь запустивший скрипт должен ждать пока вы её не разблокируете. | |
|
|
|
|
|
|
|
для: Саня
(14.01.2007 в 21:53)
| | LOCK TABLES придуман для того, чтоб можно было делать дампы, и выполнять прочие регламентные работы, а вовсе не для того, чтоб на этом операторе строить бизнес-логику. | |
|
|
|
|
|
|
|
для: Trianon
(14.01.2007 в 22:32)
| | А если транзакции недоступны? | |
|
|
|
|
|
|
|
для: Саня
(14.01.2007 в 23:13)
| | Это вопрос применительно к рассматриваемой задаче? | |
|
|
|
|
|
|
|
для: Trianon
(14.01.2007 в 23:17)
| | Да. | |
|
|
|
|
|
|
|
для: Саня
(14.01.2007 в 23:20)
| | Sergey89 ответил (14.01.2007 в 21:33) : Через INSERT SELECT UPDATE/INSERT
В конце концов, на пустой таблице с единственным autoincrement полем можно даже подобие секвенции организовать. | |
|
|
|
|
|
|
|
для: Trianon
(14.01.2007 в 23:26)
| | А чем плох вариант с LOCK TABLES?
И что такое секвенция в данном контексте? | |
|
|
|
|
|
|
|
для: Саня
(14.01.2007 в 23:29)
| | >А чем плох вариант с LOCK TABLES?
Он не плох. Он не нужен, на мой взгляд.
Собственно, законченного варианта с ним я не увидел.
>И что такое секвенция в данном контексте?
В данном контексте- отдельная таблица, из которой достается свежий id.
А вообще - объект БД, позволяющий получать последовательные номера. Без повторов. | |
|
|
|
|
|
|
|
для: Саня
(14.01.2007 в 23:20)
| | для решения данной задачи можно вовсе отказаться от транкзации. | |
|
|
|
|
|
|
|
для: Саня
(14.01.2007 в 23:13)
| | Использовать блокировку таблиц. Но она может пригодится при вставке очень важных данных. | |
|
|
|
|
|
|
|
для: Sergey89
(14.01.2007 в 21:33)
| | То есть? | |
|
|
|
|
|
|
|
для: kasmanaft
(14.01.2007 в 21:52)
| | Он имел ввиду это:
INSERT INTO table VALUES (0, ''text');
$id = mysql_insert_id();
UPDATE table SET field = "текст" WHERE id = $id; | |
|
|
|
|
|
|
|
для: Sergey89
(14.01.2007 в 21:30)
| | >>SELECT MAX(id) FROM table;
>это совсем не то
Храните идентификатор id в отдельной таблице... правда без транзакций тут тоже ничего хорошего не получится... | |
|
|
|
|
|
|
|
для: dima_s_d_s
(14.01.2007 в 21:18)
| |
<?php
$sql = mysql_query("SELECT LAST_INSERT_ID() FROM `table`;");
$id = mysql_result($sql, 0);
?>
|
| |
|
|
|
|
|
|
|
для: Unkind
(14.01.2007 в 21:37)
| | И это не то ;-) Человеку надо предугадать ID. | |
|
|
|
|
|
|
|
для: Sergey89
(14.01.2007 в 21:42)
| | Сенкс за помощь! | |
|
|
|
|
|
|
|
для: Sergey89
(14.01.2007 в 21:42)
| | И это не то ;-) Человеку надо предугадать ID.
<?php
$sql = mysql_query("SELECT LAST_INSERT_ID() + 1 FROM `table`;");
$id = mysql_result($sql, 0);
?>
|
:)) | |
|
|
|
|
|
|
|
для: Unkind
(14.01.2007 в 22:32)
| | а теперь читать второе сообщение. :-) | |
|
|
|
|
|
|
|
для: Sergey89
(14.01.2007 в 22:40)
| | а теперь читать второе сообщение. :-)
Была задача достать последний ID до добавления записи - я написал. Остальное меня не волнует. | |
|
|
|
|
|
|
|
для: Unkind
(14.01.2007 в 23:01)
| | Ну, если так, то да. :-) | |
|
|
|
|
|
|
|
для: Unkind
(14.01.2007 в 23:01)
| | А вариант запуска двух скриптов не рассматривали? | |
|
|
|
|
|
|
|
для: Unkind
(14.01.2007 в 22:32)
| | В таком случае получаю 1, хотя в таблице есть три записи. И сделаны они были до запуска скрипта. | |
|
|
|
|
|
|
|
для: Саня
(14.01.2007 в 23:26)
| |
function next_insert_Id() {
$query = mysql_query("SELECT MAX(id) AS maxId FROM table");
$maxId = mysql_fetch_assoc($query);
$maxId = $maxId['maxId']+1;
return $maxId;
}
|
Запрос получает максимальный ID в вашей таблице. Естественно предположить, что следующий ID будет на 1цу больше (Если это калонка AUTO_INCREMENT). Смотрите пример. | |
|
|
|
|
|
|
|
для: Razputin
(15.01.2007 в 10:45)
| | Не выйдет.
А если записи с максимальным номером уже кто-то удалял? | |
|
|
|
|
|
|
|
для: dima_s_d_s
(14.01.2007 в 21:18)
| | Попробуйте так:
select auto_increment+1 from information_schema.tables where table_name='имя таблицы' and table_schema='имя БД';
|
В данном случае получаем значение инкрементированного поля для следующей записи. | |
|
|
|