Mysqli копирование данных из таблицы в таблицу

362
24 декабря 2016, 16:25

Есть две одинаковых таблицы: data_tmp и data у которых есть по одной записи.

Можно ли как то скопировать все данные из data_tmp и data одним запросом? По сути выбрать все данные data_tmp и сделать апдейт в data?

Так как с таблицах очень много столбцов неудобно делать 2 запроса.

Answer 1

Попробуйте так

$result = mysqli_query($db, 'SELECT с1 ,с2 FROM data_tmp ') or die('error!   Записей не найдено!');
while ($rows=mysqli_fetch_row($result)){
mysqli_query($db, "INSERT INTO data (p1 ,p2) 
         VALUES(
       '".$rows[0]."','".$rows[1]."')")or die("Ошибка…". mysql_error()); 
                             }
Answer 2

Если порядок полей идентичен, то все делается одним запросом

INSERT INTO data SELECT * FROM data_tmp

но так делать сильно не рекомендуется, т.к. при изменении порядка полей у Вас будет каша без всяких сообщений.

В чем проблема получить список полей (хотя бы и забить руками), а потом сформировать запрос

$fields = 'fld1, fld2, fldn';
$sql = sprintf('INSERT INTO data (%s) SELECT %s FROM data_tmp', $fields, $fields);

Или выполнить запрос

SELECT * FROM data_tmp

а потом, на основании mysqli_stmt_result_metadata узнать имена полей и сформировать INSERT запрос?

UPDATE

Если нужно обновлять записи, то тогда нужно добавить конструкцию ON DUPLICATE KEY UPDATE но тогда уже поля придется перечислять. Но опять таки, имея список полей ничего не стоит это сделать

function upd($val) {
  return sprintf('$s = VALUES(%s)', $val, $val);
}
$fields = 'fld1, fld2, fldn';
$fld_upd = explode(',', $fields);
$fld_upd = array_map('upd', $fld_upd);
$fld_upd = implode($fld_upd);
$sql = sprintf(
  'INSERT INTO data (%s) SELECT %s FROM data_tmp ON DUPLICATE KEY UPDATE %s',
  $fields, $fields, $fld_upd
);    
READ ALSO
Как обозначить конец массива? [требует правки]

Как обозначить конец массива? [требует правки]

Не знаю как заставить сложить все элементы массива 1 разПодскажите каким оператором обозначить конец массива?

357
GWT права пользователей

GWT права пользователей

Добрый деньСледующая проблема

371