INSERT нескольких записей одним запросом

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Professor
Сообщения: 115
Зарегистрирован: 2010.11.25, 19:47
Контактная информация:

INSERT нескольких записей одним запросом

Сообщение Professor »

Здравствуйте.
Опять я беспокою Вас простыми вопросами(надеюсь в скором времени начну беспокоить сложными вопросами).

На сей раз хочу узнать, как можно создать такой запрос

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

INSERT INTO `users_galery_thumbs_img` (`users_galery_img_id`,`users_galery_id` ) VALUES ( 10, 1 ),( 54, 1 ),( 13, 1 ),( 122, 1) 
youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: INSERT нескольких записей одним запросом

Сообщение youroff »

Вроде бы через ActiveRecord нельзя сделать bulk insert... Я делал через PDO.
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: INSERT нескольких записей одним запросом

Сообщение mitaichik »

ИМХО, если insert'ов не сотни, проще сделать с помощью foreach моделей... У меня просто предубеждение, что сейчас извечную дилемму "ресурсы"/"удобство разработки" следует решать в сторону удобства разработки. (естественно, если проект не высоконагруженный). Проще чуть больше заплатить хостеру.

Кстати, понимю что оффтоп, но мы тут седня спорили с одним вполне опытным проггером на тему производительности: Он утверждает, что каждый экземпляр объекта хранит в памяти все данные (свойства объекта) и методы. Я утверждаю, что разработчики php не могли допустить такой тупости, и в памяти хранится только одно описание методов, а объекты хранят только свои свойства (криво как-то описал свою мысль, но вроде понятно). Кто прав?
mitallast
Сообщения: 207
Зарегистрирован: 2010.02.21, 20:40
Откуда: Голицыно
Контактная информация:

Re: INSERT нескольких записей одним запросом

Сообщение mitallast »

У некоторых баз данных есть механизмы загрузки больших обьемов данных. Например, в mysql есть возможность загрузить в некоторую таблицу данные из csv файла. Лучше пользоваться средствами, предоставляемыми базой данных, чем вручную делать десятки вставок в таблицу. Особенно если таблица с миллионами записей и кучкой индексов.
Professor
Сообщения: 115
Зарегистрирован: 2010.11.25, 19:47
Контактная информация:

Re: INSERT нескольких записей одним запросом

Сообщение Professor »

проще сделать с помощью foreach моделей
Да вы что такое говорите. даже 20 или 30 запросов к БД это чересчур, особенно если часто использовать.

Тут легче сделать свою функцию которая будет генерировать (1,1),(2,5) из массива.
Это не так сложно, и можно потом всю жизнь пользоваться. Просто я думал, что в Yii есть уже стандартное
youroff
Сообщения: 228
Зарегистрирован: 2010.02.25, 16:05

Re: INSERT нескольких записей одним запросом

Сообщение youroff »

Если одним нажатием кнопки пользователь делает сотню таких инсертов, то лучше все-таки bulk... тем более, что так не будет создаваться сотня объектов.
chang
Сообщения: 125
Зарегистрирован: 2010.12.03, 20:01

Re: INSERT нескольких записей одним запросом

Сообщение chang »

mitaichik писал(а):
Кстати, понимю что оффтоп, но мы тут седня спорили с одним вполне опытным проггером на тему производительности: Он утверждает что каждый экземпляр объекта хранит в памяти все данные (свойства объекта) и методы. Я утверждаю что разработчики php не могли допустить такой тупости, и в памяти храниться только одно описание методов, а объекты хранят только свои свойства (криво как-то описал свою мысль, но вроде понятно). Кто прав?
статические методы существуют в 1 экземпляре в памяти
для остальных же создаются дубликаты, для каждого экземпляра класса ( со всеми потрохами: методы, константы, переменные.... )


Professor писал(а):Да вы что такое говорите. даже 20 или 30 запросов к БД это чересчур, особенно если часто использовать.
как по мне то prepared statements + foreach и те 20-30 СУБД даже не ощутит
но возможно я не работал с нагруженными проектами или небыл ограничен в ресурсах
--------------------
add
-----------
да, походу я таки был не совсем прав http://www.mysql.ru/docs/man/Insert_speed.html
Аватара пользователя
xoma
Сообщения: 641
Зарегистрирован: 2009.04.02, 15:24
Откуда: Ногинск
Контактная информация:

Re: INSERT нескольких записей одним запросом

Сообщение xoma »

Если будете делать через foreach - не забудьте все это дело обернуть в транзакцию...
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: INSERT нескольких записей одним запросом

Сообщение Svyatov »

chang писал(а):статические методы существуют в 1 экземпляре в памяти
для остальных же создаются дубликаты, для каждого экземпляра класса ( со всеми потрохами: методы, константы, переменные.... )
Вынужден опровергнуть. Тест показал, что память расходуется абсолютно одинаково и для статических и для обычных методов.
А вот дублируются ли сами методы - не знаю.
Аватара пользователя
skeef
Сообщения: 67
Зарегистрирован: 2010.10.30, 20:41

Re: INSERT нескольких записей одним запросом

Сообщение skeef »

При сохранении формы необходимо было записывать в другую таблицу (модель) несколько записей.
Вариант втупую:

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

            if ( $model->save() )
            {
                if( $model->form_flag || $model->activity_flag)
                {
                    $others = new Others();
                    $others->usorg_id = $model->id;

                    if( $model->form_flag )
                    {
                        $others->field_name = 'form';
                        $others->field_value = $model->new_form;
                        $others->save(false);
                    }
                    if( $model->activity_flag )
                    {
                        $others->field_name = 'activity';
                        $others->field_value = $model->new_activity;
                        $others->save(false);
                    }
                }
                $this->redirect( array ( 'view', 'id' => $model->id ) );
            } 
не прокатил - в базу заносилась только последняя запись.
Обернуть в транзакции, как предложил xoma не привел ни к чему - также только одна последняя запись.

Решил проблему так:
создал в модели метод

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

public function mSave($id, $field, $value)
    {
        $ot = new Others();
        $ot->usorg_id = $id;
        $ot->field_name = $field;
        $ot->field_value = $value;
        $ot->save();
    } 
а в контроллере сделал так:

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

            if ( $model->save() )
            {
                if ( $model->form_flag )
                    Others::model()->orgSave( $model->id, 'form', $model->new_form );

                if ( $model->activity_flag )
                    Others::model()->orgSave( $model->id, 'activity', $model->new_activity );

                 $this->redirect( array ( 'view', 'id' => $model->id ) );
            } 
хотя, наверное, надо было создать метод mSave в контроллере ...
Вопрос: не уверен что сделал грамотно. Возможно есть решение более каноническое что-ли ... Подскажите, плз
Processor not found! Software emulation ...
Аватара пользователя
mat.twg
Сообщения: 222
Зарегистрирован: 2012.02.22, 20:44
Откуда: Санкт-Петербург

Re: INSERT нескольких записей одним запросом

Сообщение mat.twg »

Возрождаю тему! Есть ли решение на Ar для таких запросов? может всё уже поменялось с 1.1.12 ?
Ответить