Mysql Выберите строку, обновите значения и вставьте в другую таблицу - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть временная таблица с несколькими строками:

$query = "CREATE TEMPORARY TABLE {$tn} (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(255) NOT NULL,
  `title` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB";

Я хотел бы выбрать каждую строку в этой таблице, обнулить идентификатор, обновить 'тип' (например) и вставить целую выбранную строку в другую таблицу (в которой есть те же столбцы, что и в этой таблице).

Я пробовал это, но я получаю сообщение об ошибке рядом с SET (у вас есть ошибка в вашем синтаксисе SQL; обратитесь к руководству, соответствующему вашей версии сервера MariaDB, чтобы узнать правильный синтаксис для использования рядом с 'SET)

 foreach ($ids as $id) {//this is each id in temp table

    $query = "INSERT INTO $another_table
              SELECT * FROM {$tn} WHERE id='$id'
              SET id=NULL, type='foo'";

    $result = $conn->query($query) or die(mysqli_error($conn)); 

}

Ответы [ 4 ]

0 голосов
/ 05 января 2019

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

select concat('target.', column_name ,' = ','source.', column_name ,', ') as line
from `columns` 
where `columns`.table_name = 'target';
0 голосов
/ 09 сентября 2018

Ваш SQL-код недопустим. У вас есть оператор вставки с оператором set.
Все, что вам нужно, - это просто INSERT SELECT, для цикла также нет необходимости.

INSERT INTO$ another_table (id, type, title) SELECT id, 'foo', title FROM {$ tn}

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

ОБНОВЛЕНИЕ $ another_table SET id = NULL

https://dev.mysql.com/doc/refman/8.0/en/insert-select.html

0 голосов
/ 09 сентября 2018

Если в обеих ваших таблицах одинаковое количество столбцов с одинаковым порядком, и вы хотите избежать перечисления каждого столбца, вы можете просто скопировать запись и обновить измененное значение в одной транзакции:

START TRANSACTION;

INSERT INTO table2 SELECT * FROM table1 WHERE id = 57;

UPDATE table2 SET columnYouWantToChange="New Value" WHERE id = 57;

COMMIT;

Но, может быть, вам следовало бы НАУЧИТЬ, чего вы пытаетесь достичь? имея 2 таблицы с одинаковыми колонками "пахнет" как плохой дизайн. Может быть, вам лучше использовать ту же таблицу вместе с номерами ревизий вашей строки данных?

0 голосов
/ 09 сентября 2018

Я не гуру PHP, но вы должны следовать этому синтаксису. Вы можете выбрать любое количество констант по вашему желанию из таблицы.

INSERT INTO $another_table (id, type, title)
SELECT NULL, 'foo', title
FROM {$tn}
WHERE id = '$id';

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

Обратите внимание, что в идеале вы должны использовать готовое утверждение здесь.

...