Добрый день!
ПОКАЖУ НА ПАЛЬЦАХ: допустим таблица имеет такую колонку: 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 не выполняя последнийй запрос) |
1+(select max(id) from <имя таблицы>) _________________ Скажи мне чей Крым, и я скажу кто ты. |
Leon
так ведь несколько записей с конца могут быть удалены |
хы. а по другому никак ![]() _________________ Скажи мне чей Крым, и я скажу кто ты. |
Brain писал(а): при следующем запросе
insert into ('', ....) мы узрели 1 2 4 это точно? _________________ Скажи мне чей Крым, и я скажу кто ты. |
обычно такая операция нужна чтобы узнать, какой ид получит новая запись.
выход - делать поле автоинкрементным. после добавления записи следующим запросом узнавать какой ид она получила. $q = mysql_query("select last_insert_id() last_id", $this->link); итд _________________ Ин дер гросен фамилие нихт клювен клац-клац ![]() |
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. _________________ Йа - водоросль. |
_________________ Йа - водоросль. |
mysql_insert_id() конвертирует возвращаемый функцией MySQL C API тип значения функции mysql_insert_id() в тип long int (называемый int в PHP). Если ваша колонка AUTO_INCREMENT имеет тип BIGINT, значение, возвращаемое функцией mysql_insert_id(), будет искажено. Вместо него используйте функцию SQL LAST_INSERT_ID(). _________________ Ин дер гросен фамилие нихт клювен клац-клац ![]() |
andy ice
Brain писал(а): допустим таблица имеет такую колонку:
id int(10) not null auto_increment, _________________ Йа - водоросль. |
да не вопрос. просто обычно такие вещи запихиваются в класс-обертку, и этот класс потом таскается по всем проектам.
следовательно заранее не знаешь, и проблем теоретически когданить можно огрести _________________ Ин дер гросен фамилие нихт клювен клац-клац ![]() |
Leon писал(а): это точно?да.. иначе никак.. к сожалению (( |
По сути согласен, тем более что вопрос из разряда RTFM. _________________ Йа - водоросль. |
andy ice писал(а): обычно такая операция нужна чтобы узнать, какой ид получит новая запись.
выход - делать поле автоинкрементным. после добавления записи следующим запросом узнавать какой ид она получила. $q = mysql_query("select last_insert_id() last_id", $this->link); итд т.е. нельзая узнать автоинкрементное поле [перед добавлением]??? или всетаки решаемо? если не пхп , может мускулом? |
Brain
select max(id) from table _________________ Ин дер гросен фамилие нихт клювен клац-клац ![]() |
andy ice писал(а): Brain
select max(id) from table этим запросом мы получим последний добавленный ид.. как получить ид который БУДЕТ добавлен (без использования инсерта) с учетом того что последние колонки из таблицы могли быть удалены? или это не решаемо? Леон склоняется ко второму Leon писал(а): хы. а по другому никак ![]() Последний раз редактировалось: Brain (2006.09.28 15:04.18), всего редактировалось 1 раз |
Brain писал(а): с учетом того что последние колонки из таблицы могли быть удалены? тогда только через автоинкрементное поле. или БД-шное или самописное _________________ Ин дер гросен фамилие нихт клювен клац-клац ![]() |
andy ice писал(а):
тогда только через автоинкрементное поле. или БД-шное или самописное с самописным понятно.. можно поподробнее насчет БД-шного поля ![]() БД - mysql |
Добавляешь новую строку - смотришь её ид и удаляешь. Следущий ид будет на 1 больше ![]() _________________ Скажи мне чей Крым, и я скажу кто ты. |
Slin
што? _________________ Скажи мне чей Крым, и я скажу кто ты. |
Вы извращенцы, однозначно.
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 раз |
Петрович писал(а): сначала инсетрить, потом узнавать id![]() _________________ Ин дер гросен фамилие нихт клювен клац-клац ![]() |
show table status
На каждую табличку возвратит по записи. Поле name - имя таблицы, поле auto_increment - следующее значение автоинкрементного поля Работает, начиная с версии 3.23. |
о. и дату обновления тоже выводит. полезненько ![]() _________________ Ин дер гросен фамилие нихт клювен клац-клац ![]() |
Петрович писал(а): За время между select и insert в данную таблицу может быть добавлена запись другим процессом.Уже, наверное, не в тему, но может кому пригодится: lock tables таблица1, таблица2, ... write; читаем, вставляем, удаляем, обновляем таблицы 1,2,... unlock tables Мьютех, однако. Остальные потоки блокируются на указанных таблицах, пока в текущем не отработает unlock, другой lock или не произойдет разрыв соединения. |
хорошо ![]() жаль мускль не юзаю ![]() _________________ Скажи мне чей Крым, и я скажу кто ты. |
xdsl
мы думали про лок. нехорошо это. _________________ Ин дер гросен фамилие нихт клювен клац-клац ![]() |
Почему-ж? Во многом легче и быстрее транзакции, особенно при небольшом объеме обработки. С проблемами лично я сталкивался в трех случаях
1. Классической deadlock. A заблокировал table1 и пытается заблокировать table2. В это время B заблокировал table2 и пытается заблокировать table1. Это решается правилом: "все, что надо заблокировать, блокировать одним lock tables" 2. Длительные операции обработки блокированных таблиц. Ну это, понятно, не решается никак, кроме как оптимизацией обработки. Если уж совсем невозможно - переходить на транзакции. 3. Кривые руки программиста при использовании постоянных соединений. Забыл сделать unlock и заблокировал таблицу намертво, пока mod_php висит в памяти. |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы можете скачивать файлы |