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

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Аватара пользователя
phillip
Сообщения: 53
Зарегистрирован: 2011.01.24, 18:03
Контактная информация:

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

Сообщение phillip » 2012.01.25, 20:28

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

Nitrino
Сообщения: 23
Зарегистрирован: 2012.01.22, 23:25

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

Сообщение Nitrino » 2012.01.25, 20:51

id только что вставленной записи можно узнать так

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

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

chang
Сообщения: 125
Зарегистрирован: 2010.12.03, 20:01

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

Сообщение chang » 2012.01.25, 22:21

ну или так

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

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

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

esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

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

Сообщение esche » 2012.01.25, 22:24

Вообще...

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

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

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

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

Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

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

Сообщение Caveman » 2012.01.25, 22:33

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

Dismal
Сообщения: 247
Зарегистрирован: 2011.10.16, 13:25

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

Сообщение Dismal » 2012.01.25, 22:50

Вот таким образом в поведении сохраняю HAS_ONE:

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

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

kvs1904
Сообщения: 2
Зарегистрирован: 2012.01.25, 23:01

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

Сообщение kvs1904 » 2012.01.25, 23:05

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

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

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

Dismal
Сообщения: 247
Зарегистрирован: 2011.10.16, 13:25

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

Сообщение Dismal » 2012.01.26, 02:32

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 автоинкремент и не установлен до записи в БД, он будет заполнен автоматически сгенерированным значением.

TM123
Сообщения: 604
Зарегистрирован: 2011.06.09, 11:18

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

Сообщение TM123 » 2012.01.26, 11:48

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

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

esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

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

Сообщение esche » 2012.01.26, 15:04

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

Аватара пользователя
phillip
Сообщения: 53
Зарегистрирован: 2011.01.24, 18:03
Контактная информация:

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

Сообщение phillip » 2012.01.27, 10:11

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

Аватара пользователя
radamir
Сообщения: 142
Зарегистрирован: 2009.08.10, 08:02
Откуда: Новосибирск

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

Сообщение radamir » 2012.01.27, 10:24

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

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

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

TM123
Сообщения: 604
Зарегистрирован: 2011.06.09, 11:18

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

Сообщение TM123 » 2012.01.27, 11:33

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

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

Аватара пользователя
phillip
Сообщения: 53
Зарегистрирован: 2011.01.24, 18:03
Контактная информация:

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

Сообщение phillip » 2012.01.27, 11:46

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

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

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

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

TM123
Сообщения: 604
Зарегистрирован: 2011.06.09, 11:18

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

Сообщение TM123 » 2012.01.27, 11:57

Ну хозяин барин, вам конечно виднее.

Puzik
Сообщения: 6
Зарегистрирован: 2013.08.20, 01:51

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

Сообщение Puzik » 2013.08.30, 02:05

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

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

Аватара пользователя
howard
Сообщения: 528
Зарегистрирован: 2012.11.16, 18:55
Откуда: Україна, Вінниця

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

Сообщение howard » 2013.08.30, 02:44

Puzik писал(а):Ксати супер удобная вещь
Конечно удобная:
Puzik писал(а):приходится переименовывать картинки вручную на сервере
:D
Агрегатор цен на услуги хостинга - https://hostcost.net

Аватара пользователя
SiZE
Сообщения: 2691
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

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

Сообщение SiZE » 2013.08.30, 08:30

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

Аватара пользователя
tsurka
Сообщения: 217
Зарегистрирован: 2012.05.07, 17:10
Откуда: Приднестровье

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

Сообщение tsurka » 2013.08.30, 09:20

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

Аватара пользователя
sluchainiyznak
Сообщения: 617
Зарегистрирован: 2013.05.19, 17:51
Откуда: ХМАО-Югра, г. Сургут
Контактная информация:

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

Сообщение sluchainiyznak » 2013.08.30, 11:04

У меня прикрепление файлов к объекту реализовано в afterSave()

Ответить