Страница 1 из 2

Узнать будущий id

Добавлено: 2012.01.25, 20:28
phillip
ребят, как узнать какой id (auto increment) получит будущая запись в бд? А также узнать айди только что внесенной записи в бд

Re: Узнать будущий id

Добавлено: 2012.01.25, 20:51
Nitrino
id только что вставленной записи можно узнать так

Код: Выделить всё

Yii::app()->db->lastInsertID
.
Узнать id будущей записи на сколько я знаю в Yii нельзя и хорошо что нельзя. Так делать категорически противопоказано, ибо за промежуток времени между тем как узнал будущий id и вставил запись какой-нибудь скрипт может уже произвести запись

Re: Узнать будущий id

Добавлено: 2012.01.25, 22:21
chang
ну или так

Код: Выделить всё

$model = new Model();
$model->name = "test";
$mode->save();

echo $model->id;  // "айди только что внесенной записи в бд"
а в будущее заглядывать имхо нет надобности

Re: Узнать будущий id

Добавлено: 2012.01.25, 22:24
esche
Вообще...

Код: Выделить всё

SHOW TABLE STATUS LIKE 'my_table_name'
в одноимённом столбце вернёт следующий id-шник..

Код: Выделить всё

SELECT auto_increment FROM information_schema.tables WHERE table_name='my_table_name'
или так..
Использовать можно, но с умом.

Re: Узнать будущий id

Добавлено: 2012.01.25, 22:33
Caveman
Лучше все же использовать транзакции...
Другая причина получения нового айдишника идеологически не прокатывает :)

Re: Узнать будущий id

Добавлено: 2012.01.25, 22:50
Dismal
Вот таким образом в поведении сохраняю HAS_ONE:

Код: Выделить всё

public function beforeSave()
{
        $address = $this->getAddress();
        $address->save();
        $this->getOwner()->address_id = $address->id;
} 
Это верный подход?

Re: Узнать будущий id

Добавлено: 2012.01.25, 23:05
kvs1904
Dismal писал(а):Вот таким образом в поведении сохраняю HAS_ONE:

Код: Выделить всё

public function beforeSave()
{
        $address = $this->getAddress();
        $address->save();
        $this->getOwner()->address_id = $address->id;
} 
Это верный подход?
так не получиться, как можно узнать ID в методе beforeSave ?
вам нужно afterSave кроме того
У модели нужно объявить _pk = '???', где ??? -имя ключа, и проследить чтобы елемент первичный ключ был строго равен NULL, иначе ничего  $address->id вам не вернет.

Re: Узнать будущий id

Добавлено: 2012.01.26, 02:32
Dismal
kvs1904, это код работающего приложения.

Из API (http://www.yiiframework.com/doc/api/1.1 ... ave-detail):
And if its primary key is auto-incremental and is not set before insertion, the primary key will be populated with the automatically generated key value.
* Если PK автоинкремент и не установлен до записи в БД, он будет заполнен автоматически сгенерированным значением.

Re: Узнать будущий id

Добавлено: 2012.01.26, 11:48
TM123
1. Приведенные способы для MySQL не корректны, потому что таким образом можно выяснить какой id будет иметь следующая запись, но где гарантия что следующая будет ваша? Гарантированно модно узнать только id уже вставленной.
2. Есть базы, в которых вычисления auto increment полей идет через последовательности, например, Postgres, в таких базах можно запросить следующий id (в Postgres это функция nextval(seq_name)) и тем самым забронировать его номер за своей операцией, после чего это id нужно будет принудительно указать для записи при вставке, иначе при вставке будет сгениророван следующий новый id. Недостаток такого метода в том, что если есть возможность отмены операции, то в последовательности идентификаторов будет дырка, есть системы которым это критично.

В общем рекомендую пользоваться id последней вставленной записи - это правильный и однозначный метод ну и менее трудоемкий в реализации. Я не совсем представляю какая может быть задача чтобы пользоваться вариантом 2 вместо варианта 1.

Re: Узнать будущий id

Добавлено: 2012.01.26, 15:04
esche
TM123 писал(а):1. Приведенные способы для MySQL не корректны, потому что таким образом можно выяснить какой id будет иметь следующая запись, но где гарантия что следующая будет ваша? Гарантированно модно узнать только id уже вставленной.
Корректны-корректны.. вопрос был "какой ID у будущей записи" :)
p.s. при особом желании можно и гарантии получить. :)
p.p.s. Естественно, лучше использовать уже вставленную запись и её ID

Re: Узнать будущий id

Добавлено: 2012.01.27, 10:11
phillip
ого какую бурную дискуссию вызвал такой простой вопрос))
насчет будущих айди- в эту таблицу сохраняю только я, то есть никто явно будущий айди не займет кроме меня. А одно из полей- имя файла, которое есть ид_записи.жпг Вообщем можно сделать и иначе чуть, сохранить сперва а потом апдейтить нужное поле

Re: Узнать будущий id

Добавлено: 2012.01.27, 10:24
radamir
phillip писал(а):насчет будущих айди- в эту таблицу сохраняю только я, то есть никто явно будущий айди не займет кроме меня.
То есть вы делаете веб-приложение которым будете пользоваться только вы? Может оно вобще будет не онлайн?
phillip писал(а):А одно из полей- имя файла, которое есть ид_записи.жпг
Тогда зачем вам вообще нужно это поле? Вы можете всегда выбрать запись и составить имя файла прямо в методе модели, что-то типа:

Код: Выделить всё

public function getImageFile() {
    return '/path/to/image/dir/'.$this->id.'.jpg';
}

Re: Узнать будущий id

Добавлено: 2012.01.27, 11:33
TM123
Ну вообще правильно сначала вставить, потом изменять, а не наоборот, потому что если вставка не пройдет, то у вас разрушится целостность данных и дальше, в зависимости от организации данных, сборщик мусора не сможет обработать корректно ситуацию, когда сначала вставили, потом обновили, в случае вставки без обновления делается простейший сборщик мусора, который трет все что ни с чем не связано. Ну это на случай если БД не поддерживает транзакций, по правильному все это в транзакцию надо оборачивать.

Ну и присоединюсь к замечаниям предыдущего автора, оно у вас не on-line?

Re: Узнать будущий id

Добавлено: 2012.01.27, 11:46
phillip

Код: Выделить всё

оно у вас не on-line? 
я сказал что добавляю данные в эту таблицу я один, а не в эту базу данных.

Код: Выделить всё

Вы можете всегда выбрать запись и составить имя файла прямо в методе модели, что-то типа
чудеса! сколько лет живу, никогда не думал о таком (это сарказм :D )

Re: Узнать будущий id

Добавлено: 2012.01.27, 11:57
TM123
Ну хозяин барин, вам конечно виднее.

Re: Узнать будущий id

Добавлено: 2013.08.30, 02:05
Puzik
Лично я в такой ситуации делал так:
брал запросом номер id последней записи в БД. и прибавлял ей единичку.
Это число $new_id = $id+1 я заносил и в БД вместо автоинкримента и именовал так фотки к товару.
Неужели вам не понятно зачем это нужно автору? Что бы выводить картинки товара или статьи под таким же названием как и айдишник товара или статьи.

Ксати супер удобная вещь. У меня так работал каталог на 50тыс товаров. Вывод был безумный. И все работало как часики. Но сделал другой сайт так же и там начались бока с сохранением, так и забросил, впадлу потратить час приходится переименовывать картинки вручную на сервере, что бы с новостями картинки совпадали :-)

Re: Узнать будущий id

Добавлено: 2013.08.30, 02:44
howard
Puzik писал(а):Ксати супер удобная вещь
Конечно удобная:
Puzik писал(а):приходится переименовывать картинки вручную на сервере
:D

Re: Узнать будущий id

Добавлено: 2013.08.30, 08:30
SiZE
phillip писал(а):ребят, как узнать какой id (auto increment) получит будущая запись в бд?
Если появляются такие вопросы, то 99,(9)% у тебя что-то не в порядке с архитектурой.

Re: Узнать будущий id

Добавлено: 2013.08.30, 09:20
tsurka
phillip писал(а):ребят, как узнать какой id (auto increment) получит будущая запись в бд? А также узнать айди только что внесенной записи в бд
Давненько мне как-то тоже требовался этот id, на сайте в папке с id статьи лежали ее файлы, фотки и т.д. Я пошел немного другим путем, просто делается папка для админа который добавляет статью и ее файлы, все кидается в его папку, далее после инсерта в табличку, файлики идут уже в папку добавленной статьи. Как-то так :)

Re: Узнать будущий id

Добавлено: 2013.08.30, 11:04
sluchainiyznak
У меня прикрепление файлов к объекту реализовано в afterSave()