Список форумов Шадринский форум -> Программирование -> PHP, PERL, HTML, CSS etc -> mysql - вывод следующего автоинкрементной колонки
Начать новую тему   Ответить на тему   вывод темы на печать

mysql - вывод следующего автоинкрементной колонки

Автор
Сообщение
Brain
Писатель


Пол: Пол:Муж.
Зарегистрирован: 01.12.2004
Сообщения: 357


Статус: Offline
СообщениеДобавлено: 2006.09.28 13:45.23
Ответить с цитатой
Добрый день!


ПОКАЖУ НА ПАЛЬЦАХ:
допустим таблица имеет такую колонку:

id int(10) not null auto_increment,
....

добавляем какието значения
insert into ('', ....)
insert into ('', ....)
insert into ('', ....)

видим в базе следующее(id)

1
2
3

убиваем последние данные в таблице
delete from table where id = '3';

при следующем запросе
insert into ('', ....)

мы узрели
1
2
4
----------------------------------

нужен запрос который получает следующее значение атоинкрементной колонки
(тоесть после всех этих операций 5.......
или 4 не выполняя последнийй запрос)
Посмотреть профиль Отправить личное сообщение
Leon
Бот-тролль 85 лв


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 61661


Статус: Offline
СообщениеДобавлено: 2006.09.28 13:59.39
Ответить с цитатой
1+(select max(id) from <имя таблицы>)
_________________
Скажи мне чей Крым, и я скажу кто ты.
Посмотреть профиль Отправить личное сообщение
Slin
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 17.12.2004
Сообщения: 1869


Статус: Offline
СообщениеДобавлено: 2006.09.28 14:02.22
Ответить с цитатой
Leon
так ведь несколько записей с конца могут быть удалены
Посмотреть профиль Отправить личное сообщение ICQ Number
Leon
Бот-тролль 85 лв


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 61661


Статус: Offline
СообщениеДобавлено: 2006.09.28 14:03.28
Ответить с цитатой
хы. а по другому никак Smile
_________________
Скажи мне чей Крым, и я скажу кто ты.
Посмотреть профиль Отправить личное сообщение
Leon
Бот-тролль 85 лв


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 61661


Статус: Offline
СообщениеДобавлено: 2006.09.28 14:05.13
Ответить с цитатой
Brain писал(а):
при следующем запросе
insert into ('', ....)

мы узрели
1
2
4


это точно?
_________________
Скажи мне чей Крым, и я скажу кто ты.
Посмотреть профиль Отправить личное сообщение
Slin
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 17.12.2004
Сообщения: 1869


Статус: Offline
СообщениеДобавлено: 2006.09.28 14:07.22
Ответить с цитатой
вроде точно
Посмотреть профиль Отправить личное сообщение ICQ Number
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.09.28 14:20.55
Ответить с цитатой
обычно такая операция нужна чтобы узнать, какой ид получит новая запись.
выход - делать поле автоинкрементным. после добавления записи следующим запросом узнавать какой ид она получила.

$q = mysql_query("select last_insert_id() last_id", $this->link);
итд
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
Dio
Шаман-заводчанин


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 29757


Статус: Offline
СообщениеДобавлено: 2006.09.28 14:25.04
Ответить с цитатой
mysql_insert_id -- Get the ID generated from the previous INSERT operation
Description
int mysql_insert_id ( [resource link_identifier])


mysql_insert_id() returns the ID generated for an AUTO_INCREMENT column by the previous INSERT query using the given link_identifier. If link_identifier isn't specified, the last opened link is assumed.

mysql_insert_id() returns 0 if the previous query does not generate an AUTO_INCREMENT value. If you need to save the value for later, be sure to call mysql_insert_id() immediately after the query that generates the value.

Note: The value of the MySQL SQL function LAST_INSERT_ID() always contains the most recently generated AUTO_INCREMENT value, and is not reset between queries.
_________________
Йа - водоросль.
Посмотреть профиль Отправить личное сообщение
Dio
Шаман-заводчанин


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 29757


Статус: Offline
СообщениеДобавлено: 2006.09.28 14:35.52
Ответить с цитатой
<?php
    mysql_connect("localhost", "mysql_user", "mysql_password") or
        die("could not connect");
    mysql_select_db("mydb");

    mysql_query("INSERT INTO mytable (product) values ('kossu')");
    printf ("Last inserted record has id %d\n", mysql_insert_id());
?>

_________________
Йа - водоросль.
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.09.28 14:39.04
Ответить с цитатой
mysql_insert_id() конвертирует возвращаемый функцией MySQL C API тип значения функции mysql_insert_id() в тип long int (называемый int в PHP). Если ваша колонка AUTO_INCREMENT имеет тип BIGINT, значение, возвращаемое функцией mysql_insert_id(), будет искажено. Вместо него используйте функцию SQL LAST_INSERT_ID().
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
Dio
Шаман-заводчанин


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 29757


Статус: Offline
СообщениеДобавлено: 2006.09.28 14:43.21
Ответить с цитатой
andy ice
Brain писал(а):
допустим таблица имеет такую колонку:

id int(10) not null auto_increment,

_________________
Йа - водоросль.
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.09.28 14:44.52
Ответить с цитатой
да не вопрос. просто обычно такие вещи запихиваются в класс-обертку, и этот класс потом таскается по всем проектам.

следовательно заранее не знаешь, и проблем теоретически когданить можно огрести
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
Brain
Писатель


Пол: Пол:Муж.
Зарегистрирован: 01.12.2004
Сообщения: 357


Статус: Offline
СообщениеДобавлено: 2006.09.28 14:45.38
Ответить с цитатой
Leon писал(а):
это точно?

да.. иначе никак.. к сожалению ((
Посмотреть профиль Отправить личное сообщение
Dio
Шаман-заводчанин


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 29757


Статус: Offline
СообщениеДобавлено: 2006.09.28 14:46.11
Ответить с цитатой
По сути согласен, тем более что вопрос из разряда RTFM.
_________________
Йа - водоросль.
Посмотреть профиль Отправить личное сообщение
Brain
Писатель


Пол: Пол:Муж.
Зарегистрирован: 01.12.2004
Сообщения: 357


Статус: Offline
СообщениеДобавлено: 2006.09.28 14:49.55
Ответить с цитатой
andy ice писал(а):
обычно такая операция нужна чтобы узнать, какой ид получит новая запись.
выход - делать поле автоинкрементным. после добавления записи следующим запросом узнавать какой ид она получила.
$q = mysql_query("select last_insert_id() last_id", $this->link);
итд


т.е. нельзая узнать автоинкрементное поле [перед добавлением]???
или всетаки решаемо? если не пхп , может мускулом?
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.09.28 14:52.04
Ответить с цитатой
Brain
select max(id) from table
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
Brain
Писатель


Пол: Пол:Муж.
Зарегистрирован: 01.12.2004
Сообщения: 357


Статус: Offline
СообщениеДобавлено: 2006.09.28 15:00.29
Ответить с цитатой
andy ice писал(а):
Brain
select max(id) from table

этим запросом мы получим последний добавленный ид..
как получить ид который БУДЕТ добавлен (без использования инсерта) с учетом того что последние колонки из таблицы могли быть удалены?
или это не решаемо?

Леон склоняется ко второму
Leon писал(а):
хы. а по другому никак Smile


Последний раз редактировалось: Brain (2006.09.28 15:04.18), всего редактировалось 1 раз
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.09.28 15:04.14
Ответить с цитатой
Brain писал(а):
с учетом того что последние колонки из таблицы могли быть удалены?

тогда только через автоинкрементное поле. или БД-шное или самописное
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
Brain
Писатель


Пол: Пол:Муж.
Зарегистрирован: 01.12.2004
Сообщения: 357


Статус: Offline
СообщениеДобавлено: 2006.09.28 15:09.21
Ответить с цитатой
andy ice писал(а):

тогда только через автоинкрементное поле. или БД-шное или самописное

с самописным понятно..
можно поподробнее насчет БД-шного поля Confused:
БД - mysql
Посмотреть профиль Отправить личное сообщение
Leon
Бот-тролль 85 лв


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 61661


Статус: Offline
СообщениеДобавлено: 2006.09.28 15:34.23
Ответить с цитатой
Добавляешь новую строку - смотришь её ид и удаляешь. Следущий ид будет на 1 больше Smile
_________________
Скажи мне чей Крым, и я скажу кто ты.
Посмотреть профиль Отправить личное сообщение
Slin
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 17.12.2004
Сообщения: 1869


Статус: Offline
СообщениеДобавлено: 2006.09.28 15:45.07
Ответить с цитатой
Leon
Shocked
Посмотреть профиль Отправить личное сообщение ICQ Number
Leon
Бот-тролль 85 лв


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 61661


Статус: Offline
СообщениеДобавлено: 2006.09.28 15:59.07
Ответить с цитатой
Slin

што?
_________________
Скажи мне чей Крым, и я скажу кто ты.
Посмотреть профиль Отправить личное сообщение
Петрович
Ведущий банщик


Пол: Пол:Муж.
Зарегистрирован: 31.08.2005
Сообщения: 1392
Откуда: Сибирь...

Статус: Offline
СообщениеДобавлено: 2006.09.28 16:25.59
Ответить с цитатой
Вы извращенцы, однозначно.
1. select max(id) max_id from table
2. insert into table(id,value) values(max_id,value)

Это чудесно будет робить за исключением одного НО:
За время между select и insert в данную таблицу может быть добавлена запись другим процессом. Поэтому гораздо правильнее всеже сначала инсетрить, потом узнавать id, а потом при необходимости апдейтить нужную запись.


Последний раз редактировалось: Петрович (2006.09.28 16:42.48), всего редактировалось 1 раз
Посмотреть профиль Отправить личное сообщение ICQ Number
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.09.28 16:41.15
Ответить с цитатой
Петрович писал(а):
сначала инсетрить, потом узнавать id
не подходит ему Smile
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.09.30 04:44.21
Ответить с цитатой
show table status

На каждую табличку возвратит по записи. Поле name - имя таблицы, поле auto_increment - следующее значение автоинкрементного поля

Работает, начиная с версии 3.23.
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.09.30 09:45.17
Ответить с цитатой
о. и дату обновления тоже выводит. полезненько Embarassed
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.09.30 13:04.42
Ответить с цитатой
Петрович писал(а):
За время между select и insert в данную таблицу может быть добавлена запись другим процессом.

Уже, наверное, не в тему, но может кому пригодится:

lock tables таблица1, таблица2, ... write;
читаем, вставляем, удаляем, обновляем таблицы 1,2,...
unlock tables

Мьютех, однако. Остальные потоки блокируются на указанных таблицах, пока в текущем не отработает unlock, другой lock или не произойдет разрыв соединения.
Посмотреть профиль Отправить личное сообщение
Leon
Бот-тролль 85 лв


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 61661


Статус: Offline
СообщениеДобавлено: 2006.09.30 13:08.57
Ответить с цитатой
хорошо Smile

жаль мускль не юзаю Sad
_________________
Скажи мне чей Крым, и я скажу кто ты.
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.09.30 13:20.42
Ответить с цитатой
xdsl
мы думали про лок. нехорошо это.
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.09.30 20:54.25
Ответить с цитатой
Почему-ж? Во многом легче и быстрее транзакции, особенно при небольшом объеме обработки. С проблемами лично я сталкивался в трех случаях
1. Классической deadlock. A заблокировал table1 и пытается заблокировать table2. В это время B заблокировал table2 и пытается заблокировать table1. Это решается правилом: "все, что надо заблокировать, блокировать одним lock tables"
2. Длительные операции обработки блокированных таблиц. Ну это, понятно, не решается никак, кроме как оптимизацией обработки. Если уж совсем невозможно - переходить на транзакции.
3. Кривые руки программиста при использовании постоянных соединений. Забыл сделать unlock и заблокировал таблицу намертво, пока mod_php висит в памяти.
Посмотреть профиль Отправить личное сообщение
Страница 1 из 2
Начать новую тему   Ответить на тему   вывод темы на печать
На страницу 1, 2  След.
Показать сообщения:   
Список форумов Шадринский форум -> Программирование -> PHP, PERL, HTML, CSS etc -> mysql - вывод следующего автоинкрементной колонки

 
Перейти: 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы