У меня есть таблица, и я хочу дублировать определенные строки в таблице. Я знаю, что это не лучший способ сделать что-то, но мы ищем быстрое решение.
Вот что-то сложнее, чем я изначально думал, все, что мне нужно сделать, это скопировать всю запись в новую запись в таблицу автоматического увеличения в MySql без необходимости указывать каждое поле. Это связано с тем, что таблица может измениться в будущем и может нарушить дублирование. Я буду дублировать записи MySQL из PHP.
Это проблема, потому что в запросе «SELECT *» MySql попытается скопировать идентификатор копируемой записи, которая генерирует дублируемую идентификационную ошибку.
Это блокирует: INSERT INTO customer SELECT * FROM customer WHERE customerid=9181
. Он также блокирует INSERT INTO customer (Field1, Field2, ...) SELECT Field1, Field2, ..... FROM customer WHERE customerid=9181.
Есть ли способ сделать это с PHP или MySQL?
Я наконец нашел этот код. Я уверен, что это поможет людям в будущем. Так вот оно.
function DuplicateMySQLRecord ($table, $id_field, $id) { // load the original record into an array $result = mysql_query("SELECT * FROM {$table} WHERE {$id_field}={$id}"); $original_record = mysql_fetch_assoc($result); // insert the new record and get the new auto_increment id mysql_query("INSERT INTO {$table} (`{$id_field}`) VALUES (NULL)"); $newid = mysql_insert_id(); // generate the query to update the new record with the previous values $query = "UPDATE {$table} SET "; foreach ($original_record as $key => $value) { if ($key != $id_field) { $query .= '`'.$key.'` = "'.str_replace('"','\"',$value).'", '; } } $query = substr($query,0,strlen($query)-2); # lop off the extra trailing comma $query .= " WHERE {$id_field}={$newid}"; mysql_query($query); // return the new id return $newid; }
Вот ссылка на статью http://www.epigroove.com/posts/79/how_to_duplicate_a_record_in_mysql_using_php
Как насчет
insert into test.abc select null, val1, val2 from test.abc where val2 = some_condition;
Кажется, так работает для меня. Замените свой стол, поля, состояние, конечно.
Значение null позволяет БД генерировать идентификатор автоинкремента для вас.
Опции:
Избегайте использования шаблона *
и укажите все столбцы самостоятельно. Но вы говорите, что таблица, как ожидается, изменится в будущем, и это не приемлемое решение для вашего дела.
Интроспекция столбцов из определения текущей таблицы (с использованием DESCRIBE
или путем запроса INFORMATION_SCHEMA.COLUMNS
). Используйте эту информацию о метаданных для построения запроса, опустив столбец первичного ключа автоматического увеличения.
Сделайте запрос SELECT *
, верните строку в свое приложение и удалите из нее столбец автоматического увеличения. Затем используйте этот кортеж для построения INSERT
.
Короче говоря, у вас есть сложное требование для адаптации к изменяющимся метаданным. Вероятно, это невозможно сделать в одном запросе.
Как насчет копирования строк в таблицу temp, а затем обратно в таблицу клиентов? Я думаю, что это заставит mysql дать ему новый идентификатор автоинкремента, особенно со второй версией запроса, который вы опубликовали.
До сих пор две записи, и вот третий вариант: в PHP динамически определять поля в вашей таблице. Или вы можете сделать список массивов полей, которые вы «жестко-кодируете», поддерживать вручную, чтобы отразить таблицу. Ваш результирующий запрос не будет использовать *.
Если вы знаете имя столбца первичного ключа в своей таблице (и я предполагаю, что вы это делаете, потому что оно все равно в позиции where), я думаю, вы могли бы это сделать:
Изменить – я забыл, что MySQL не поддерживает select … in. Это должно работать вместо этого
create new_table select * from customer where customerid = 9181 alter table new_table drop column customerid insert into customer select null, * from new_table drop table new_table