Также стоит знать, что Вы, возможно, должны включать .\
перед названием сценария. Например:
.\scriptname.ps1
Наконец-то я нашел этот код. Я уверен, что это поможет людям в будущем. Итак, вот оно.
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
Параметры:
Избегайте использования подстановочного знака *
и укажите все столбцы самостоятельно. Но вы говорите, что таблица, как ожидается, изменится в будущем, и это не подходящее решение для вашего случая.
Изучите столбцы из текущего определения таблицы (используя DESCRIBE
или запрос INFORMATION_SCHEMA.COLUMNS
). Используйте эту информацию о метаданных для построения запроса, опуская столбец первичного ключа с автоинкрементом.
Выполните запрос SELECT *
, извлеките строку обратно в приложение, а затем удалите столбец с автоинкрементом. от него. Затем используйте этот кортеж для создания оператора INSERT
.
Короче говоря, у вас есть сложное требование адаптироваться к изменению метаданных. Вероятно, это невозможно сделать с помощью одного запроса.
Как насчет копирования строк во временную таблицу, а затем обратно в таблицу клиентов? Я думаю, что это заставит mysql присвоить ему новый идентификатор автоинкремента, особенно со второй версией отправленного вами запроса.
Если вы знаете имя столбца первичного ключа в своей таблице (и я предполагаю, что вы знаете, потому что он в любом случае находится в предложении where), я думаю, вы могли бы сделать это:
Edit - я забыл, что MySQL не поддерживает select ... into. Вместо этого это должно сработать
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
А что насчет
insert into test.abc select null, val1, val2 from test.abc where val2 = some_condition;
Похоже, у меня так работает. Замените вашу таблицу, поля, условие, конечно.
Нулевое значение позволяет БД генерировать автоматически увеличивающийся ID для вас.
На данный момент два сообщения, и вот третий вариант: в PHP динамически определять поля в вашей таблице. Или вы можете составить список полей, которые вы «жестко запрограммируете», и поддерживаете вручную, чтобы отображать таблицу. В вашем результирующем запросе не будут использоваться *.