INSERT нескольких строк

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
maxtor
Сообщения: 78
Зарегистрирован: 2011.12.06, 11:04

INSERT нескольких строк

Сообщение maxtor »

Вот такая вставка:

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

// выражение SQL с двумя маркерами «:username» и «:email»
$sql="INSERT INTO tbl_user(username, email) VALUES(:username,:email)";
$command=$connection->createCommand($sql);
// меняем маркер «:username» на соответствующее значение имени пользователя
$command->bindParam(":username",$username,PDO::PARAM_STR);
// меняем маркер «:email» на соответствующее значение электронной почты
$command->bindParam(":email",$email,PDO::PARAM_STR);
$command->execute();
// вставляем следующую строку с новыми параметрами
$command->bindParam(":username",$username2,PDO::PARAM_STR);
$command->bindParam(":email",$email2,PDO::PARAM_STR);
$command->execute();
Вызовет две вставки? Или одну скомбинированную: values (), () ?
maxtor
Сообщения: 78
Зарегистрирован: 2011.12.06, 11:04

Re: INSERT нескольких строк

Сообщение maxtor »

Вообщем, как сделать пакетное добавление записей? Т.е. сгруппировать INSERT INTO ... VALUES (), (), (), ...
maxtor
Сообщения: 78
Зарегистрирован: 2011.12.06, 11:04

Re: INSERT нескольких строк

Сообщение maxtor »

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

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

$values = array();
		for ($i = 0; $i < count($this->steps); $i++)
			$values[] = '(:goal_id'.$i.', :name'.$i.', :descr'.$i.')';
		$command = $db->createCommand("	INSERT INTO `goal_steps` (
											`goal_id`,
											`name`,
											`descr`
										) VALUES ".implode(', ', $values));
		for ($i = 0; $i < count($this->steps); $i++) {
			$command->bindParam(':goal_id'.$i, $goal_id, PDO::PARAM_INT);
			$command->bindParam(':name'.$i, $this->steps[$i], PDO::PARAM_STR);
			$command->bindParam(':descr'.$i, $this->steps_descr[$i], PDO::PARAM_STR);
		}
		$command->execute();
При таком способе, время запроса всегда одинаково и не зависит от числа вставляемых строк.

Может кто подскажет более красивый способ?
maxtor
Сообщения: 78
Зарегистрирован: 2011.12.06, 11:04

Re: INSERT нескольких строк

Сообщение maxtor »

посмотрел исходных код команды, запрос строится по такому же принципу, спасибо.
Просто не люблю построители запросов. предпочитаю на sql их делать самостоятельно.
Skiller
Сообщения: 627
Зарегистрирован: 2011.11.27, 00:21

Re: INSERT нескольких строк

Сообщение Skiller »

Да, только я был не прав. Тут построитель вернет только 1 инсерт, а не несколько их. так что ваш вариант пока что лучше моего.
esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: INSERT нескольких строк

Сообщение esche »

maxtor писал(а):Может кто подскажет более красивый способ?
В общем - подход правильный
http://stackoverflow.com/questions/1176 ... ngle-query

Разве что массив предпочтительно foreach-ем обходить.. (и count() в условии не юзать)
Ну, и параметры можно в $params складывать в одном цикле с формированием строки..
И "вопросики" можно использовать (см ссылку)
...
Аватара пользователя
skeef
Сообщения: 67
Зарегистрирован: 2010.10.30, 20:41

Re: INSERT нескольких строк

Сообщение skeef »

Я часто использую такую простую конструкцию, если мне надо записать много значений в базу:

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

...
foreach($ids AS $is) {
      $data = array(
        'uid' => $id,
        'date' => date('Y-m-d H:i:s'),
        'qid' => $is,
      );
      self::_oneSave($data);
    }
    ...
    
    private function _oneSave($data)
  {
    $model = new Tests();
    $model->uid = $data['uid'];
    $model->date = $data['date'];
    $model->qid = $data['qid'];
    $model->save();
// здесь можно вставить проверку ошибок
    unset($model);
  }
До сих пор работает как часики
Processor not found! Software emulation ...
Ответить