Копирование строки mysql php

Скопировать строки таблицы и записать отдельно старые и новые id

Доброго дня.
Имеется таблица БД. Например `table1`.
Необходимо скопировать определенные строки из этой таблицы в эту же. НО необходимо запомнить (записать) полученные соответствия идентификаторов
Например id старой строки соответствует id новой строки. Пусть это будет даже `table2`

Надеюсь не запутал. Отбираем например 1000 строк по условию из table1, копируем в table1 и вносим идентификаторы во вспомогат таблицу table 2 (id_old id_new)

Возможно ли такое сделать только SQL запросами? Чтобы не делать циклом для каждой строки по запросу.
Это просто образец кода копирования:

$sql="INSERT INTO `table1`(`purchase_id`, `id_username`, `org_fee`, `item_cnt`, `hidden`, `bundle_var`, `name`, `vars`, `uzer_cat`, `deletecat`, `resale`) SELECT `purchase_id`, `id_username`, `org_fee`, `item_cnt`, `hidden`, `bundle_var`, `name`, `vars`, `uzer_cat`, `deletecat`, `resale` FROM `table1`` WHERE `purchase_id` =1754";

И еще: если я в такой конструкции INSERT INTO укажу стобец с автоинктементом (эти самые id), то она не работает вроде как. ((

Что лучше оставить старые планки и добавить новые, или вытащить их и поставить новые?
Привет всем нуждаюсь в совете. У меня комп на базе AMD Мамка A8N-SLI Deluxe. Сейчас стоит у меня.

Удалить старые строки из таблицы MySQL
DELETE FROM `table` WHERE `id` =1 AND `in_time` < DATE_SUB(NOW(), INTERVAL 3 MINUTE где in_time.

Структуры. Записать отдельно имя и фамилию и отдельно числа
Есть текстовый файл по типу : Ivanov Ivan 4 8 5 9 Petrov Petr 5 2 3 4 Ktoto Tam 5 4 1 2 .

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

INSERT INTO table2(id_old, purchase_id, id_username, org_fee, item_cnt, hidden, bundle_var, name, vars, uzer_cat, deletecat, resale) VALUES (SELECT id, purchase_id, id_username, org_fee, item_cnt, hidden, bundle_var, name, vars, uzer_cat, deletecat, resale FROM table1 WHERE purchase_id =1754)

Таким запросом в таблицу2 вставятся только старые значения id, а мне нужно, чтобы я как-то узнал: какой из старого id (путем копирования) получился новый id

Перефразирую вопрос на легком примере:

Имеется таблица table1. Поле id1=autoincrement

id1 val1 val2 val3
1 товар1 ав val3-1
2 товар2 1 val3-2
3 товар3 1 val3-3
4 товар4 1 val3-4
5 товар5 df val3-5
6 товар6 df val3-6
7 товар7 fdf val3-7
8 товар8 1 val3-8
9 товар9 1 val3-9
10 товар10 df val3-10

Копируем строки где val2=1

INSERT INTO `table1` (`val1`,`val2`,`val3`) SELECT `val1`,`val2`,`val3` FROM `table1` WHERE `val2`=1;
id1 val1 val2 val3
1 товар1 ав val3-1
2 товар2 1 val3-2
3 товар3 1 val3-3
4 товар4 1 val3-4
5 товар5 df val3-5
6 товар6 df val3-6
7 товар7 fdf val3-7
8 товар8 1 val3-8
9 товар9 1 val3-9
10 товар10 df val3-10
11 товар2 1 val3-2
12 товар3 1 val3-3
13 товар4 1 val3-4
14 товар8 1 val3-8
15 товар9 1 val3-9

Теперь мне надо узнать, что из строки id1=3 (товар3), путем копирования получилась строка id1=12 (товар3). КАКОЙ ИДЕНТИФИКАТОР ТЕПЕРЬ У ТОВАРА3
то есть мне надо будет при запросе вставить данные во вспомогательную таблицу table2:

id_old id_new
2 11
3 12
4 13
8 14
9 15

Можно ли это как-то сделать с минимальным кодом?

SELECT MIN(t1.id1) AS id_old, MAX(tt1.id1) AS id_new FROM table1 t1 INNER JOIN (SELECT * FROM table1) tt1 ON t1.val1 = tt1.val AND t1.val2= tt1.val2 AND t1.val3= tt1.val3 AND t1.id1<> tt1.id1 GROUP BY t1.val1, t1.val2, t1.val3

какой крутой гавнокод у меня вышел
протести, kupidon, если селект у тебя будет корректный, то все огонь давай в продакшен )

Добавлено через 32 минуты
в общем если select новый корректный то

INSERT inti table2 (id_old, id_new) VALUES ("запрос на селект что выше")

что-то я совсем в ступоре от вашего запроса (не знаком просто с inner join, но готов учиться).
Можно я еще упрощу? чтобы не искать минимальные и максимальные значения.
Допустим товары принадлежали одной категории, а после копирования — другой. см ниже

id1 val1 val2 category
1 товар1 ав cat1
2 товар2 1 cat1
3 товар3 1 cat1
4 товар4 1 cat1
5 товар5 df cat1
6 товар6 df cat1
7 товар7 fdf cat1
8 товар8 1 cat1
9 товар9 1 cat1
10 товар10 df cat1

путем копирования отобранных мне строк, присваиваю новым строкам новую категорию:

INSERT INTO `table1` (`val1`,`val2`,`category`) SELECT `val1`,`val2`,'cat2' FROM `table1` WHERE `val2`=1;

Теперь у нас есть таблица, в которой видно какие товары были в категории cat1 и какие стали в категории cat2:

id1 val1 val2 category
1 товар1 ав cat1
2 товар2 1 cat1
3 товар3 1 cat1
4 товар4 1 cat1
5 товар5 df cat1
6 товар6 df cat1
7 товар7 fdf cat1
8 товар8 1 cat1
9 товар9 1 cat1
10 товар10 df cat1
11 товар2 1 cat2
12 товар3 1 cat2
13 товар4 1 cat2
14 товар8 1 cat2
15 товар9 1 cat2

Можно ли в одном запросе и данное копирование сделать и сразу внести данные во вспомогательную таблицу?

Добавлено через 10 минут
может union ? как-то объединить запросы

Добавлено через 5 минут

INSERT INTO `table1` (`id1` AS `id_new`,`val1`,`val2`,`category`) SELECT `id1` AS `id_old`,`val1`,`val2`,'cat2' FROM `table1` WHERE `val2`=1; UNION INSERT INTO `table2` (`id_old`,`id_new`) VALUES (`id_old`,`id_new`)

так будет работать? (копировать строки в table1 и паралельно вносить новый и старый id в другую table2)

Добавлено через 7 часов 38 минут
подскажите пожалуйста

kupidon, кстати тот адовый запрос, что я утром написал вам не проснувшимся мозгом, выдал результат как вы просили).

Join склеивает две таблицы.
Вообще по уму конечно надо использовать LAST_INSERT_ID() она возвратит нам последний id, но непосредственно в MySQL, но я так понимаю мы идем по хардкору, и будем все это дело делать в php? То для этого у нас там есть mysqli_insert_id и в pdo lastInsertId.

C Union так не получится, union просто склеивает результат двух запросов в один. Но выполняется сначала первый, а потом второй, а не параллельно.
Чтоб параллельно надо это дело в цикл загонять.

На данный момент у вас в таблице есть товары у которых название товаров совпадают (до использования insert)? Если нет то можем «утрений» запрос допилить под структуру вашей БД

ЦитатаСообщение от smatch Посмотреть сообщение

Вообще по уму конечно надо использовать LAST_INSERT_ID() она возвратит нам последний id, но непосредственно в MySQL, но я так понимаю мы идем по хардкору, и будем все это дело делать в php? То для этого у нас там есть mysqli_insert_id и в pdo lastInsertId.

LAST_INSERT_ID() — Я не знаю как внутри такого запроса , когда копируются много строк вычислять последнюю каждой строки
Да, все делаем в php, НО ЦИКЛ ДЛЯ КАЖДОЙ СТРОКИ ИСПОЛЬЗОВАТЬ НЕ ХОЧУ. СТРОК МОЖЕТ БЫТЬ НЕСКОЛЬКО ТЫСЯЧ.

Но я так и не понял (для себя изучал)- как заставить работать работать mysqli_insert_id .

ЦитатаСообщение от smatch Посмотреть сообщение

На данный момент у вас в таблице есть товары у которых название товаров совпадают (до использования insert)?

Да, совпадают 100%. Еще более важное — это совпадают категории. То есть товары лежали в одной категории, я их копирую в другую. И это работает. То есть получаю такую таблицу:

id1 val1 val2 category
1 товар1 ав cat1
2 товар2 1 cat1
3 товар3 1 cat1
4 товар4 1 cat1
5 товар5 df cat1
6 товар6 df cat1
7 товар7 fdf cat1
8 товар8 1 cat1
9 товар9 1 cat1
10 товар10 df cat1
11 товар2 1 cat2
12 товар3 1 cat2
13 товар4 1 cat2
14 товар8 1 cat2
15 товар9 1 cat2

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

Добавлено через 22 секунды

id_old id_new
2 11
3 12
4 13
8 14
9 15

Лучший ответ

Сообщение было отмечено kupidon как решение

Решение

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

1 2 3 4 5 6 7 8 9 10 11 12
// делаем селект тех товаров которые будем копировать $result = mysqli_query($link, 'SELECT нужные поля с id FROM товары Where нужная нам категория '); //теперь переберем построчно массив вставляя позиции в эту же таблицу while( $row = mysqli_fetch_assoc($result) ){ $old_id= $row['id']; $query = "INSERT INTO товары (все поля кроме id-он автоинкремент) values ($row['товар'], $row['цвет'], $row['запах'] , $row['объем'], 'категория 42')"; mysqli_query($link, $query); //получаем новый id $new_id= mysqli_insert_id($link); $query = "INSERT INTO связывающая таблица (old_id, new_id) values ($old_id, $new_id)"; mysqli_query($link, $query); }

в общем как то так
ну или можно добавить в таблицу с товарами новое поле old id и в него просто вставлять старый id когда делаем insert , по моему самый разумный вариант, и не надо городить лишнюю таблицу. А если вдруг надо то вот запрос выше, ну только в запросе синтаксис подправить

Источник

Как дублировать строку в mysql?

Есть таблица из 10 полей, первое id autoincrement key.
Как создать новую запись. скажем из строки с копируя все поля, кроме id которое создается автоматически.

Как записать «красиво» такой запрос?

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

как отправить строку из таблицы (php, сформированной из mysql) в контейнер ajax при нажатии на строку 2ым клик
Доброго времени суток) уважаемые программисты столкнулся со сложной задачей, даже не знаю в той ли.

Как добавить строку БД mysql?
вывожу строки так: procedure.

Как удалить строку из таблицы mysql?
Как удалить строку из таблицы mysql, только не update, а полностью, чтоб не осталось пустой.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
INSERT INTO `table` SELECT * FROM `table` WHERE `id` = 42; -- Ошибка: дублируется INSERT INTO `table` (`id`, `foo`, `bar`, . , `lol`) SELECT NULL, `foo`, `bar`, . , `lol` FROM `table` WHERE `id` = 42; -- надежно - все поля указаны явно и соответствуют сами себе INSERT INTO `table` (`foo`, `bar`, . , `lol`) SELECT `foo`, `bar`, . , `lol` FROM `table` WHERE `id` = 42; -- тоже надежно - знаем, что там есть id и он никуда не денется INSERT INTO `table` SELECT NULL, `foo`, `bar`, . , `lol` FROM `table` WHERE `id` = 42; -- НЕнадежно - стоит изменить структуру - запрос станет нерабочим

Нагуглил темку эту. Вопрос возник:
вот у меня задача дублировать запись. В таблице есть уникальное поле guid, но оно не autoincrement. Ну и еще поле dt (datatime) тоже будет новое.

Как бы реализовать попроще?

На ум приходит только:
1. извлечь перечень полей;
2. пройтись foreach-ем по ним, сформировав строку для insert-а;
3. извлечь данные копируемой строки;
4. заменить guid и dt;
5. сформировать insert и выполнить

Добавлено через 5 минут
и еще вопросик есть.
вот есть возможность записать insert так

INSERT INTO TABLE SET k1 = v1, k2 = v2, k3 = v3, k4 = v4, k5 = v5
INSERT INTO TABLE (v1,v2,v3,v4,v5) VALUES (k1,k2,k3,k4,k5)

Добавлено через 27 минут
в общем так, если кому понадобится

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
include('db.php'); // Подключаемся к серверу MySQL $db = mysql_connect($hostname, $username, $password) or die('connect to database failed'); // Выбираем нужную БД mysql_select_db($bd) or die('db not found'); //функция формирования guid function guid(){ mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up. $charid = strtoupper(md5(uniqid(rand(), true))); $hyphen = chr(45);// "-" $uuid = substr($charid, 0, 8).$hyphen .substr($charid, 8, 4).$hyphen .substr($charid,12, 4).$hyphen .substr($charid,16, 4).$hyphen .substr($charid,20,12); return $uuid; } $newguid=guid(); //выбираем копируемые данные $q="SELECT * FROM `".$tbl."` WHERE `guid` = '".$_GET['guid']."';"; $r = mysql_query($q) or trigger_error(mysql_errno() . ' ' . mysql_error() . ' query: ' . $q); $value=mysql_fetch_assoc($r); //формируем запрос для вставки новой строки $q="INSERT INTO `".$tbl."` SET "; foreach ($value as $k=>$v) { if ($k<>'guid' and $k<>'t') $q=$q."`".$k."`='".$v."',"; } $q=$q."`t`=".time().",`guid`='".$newguid."';"; //выполняем запрос mysql_query($q) or trigger_error(mysql_errno() . ' ' . mysql_error() . ' query: ' . $q); //закрываем соединение с БД mysql_close($db);

Источник

Читайте также:  Способы создания словаря python
Оцените статью