Я не думаю, что это полностью выполнимо в SQL без необходимости создавать временную таблицу. Делать это в памяти должно быть намного быстрее. Остерегайтесь, если вы идете по маршруту временной таблицы, вы должны выбрать уникальное имя для своей таблицы для каждого вызова функции, чтобы избежать условия гонки, когда ваш код выполняется дважды одновременно и объединяет две строки данных в одну временную таблицу.
Я не знаю, какой язык вы используете, но должна быть возможность получить список полей в вашей программе. Я бы сделал это так:
array_of_field_names = conn->get_field__list;
array_of_row_values = conn->execute ("SELECT... ");
array_of_row_values ["ID"] = new_id_value
insert_query_string = "construct insert query string from list of field names and values";
conn->execute (insert_query_string);
Затем вы можете инкапсулировать это как функцию и просто вызвать ее, указав таблицу, старый идентификатор и новый идентификатор, и это сработает, это волшебство.
В коде Perl следующий фрагмент кода будет делать:
$table_name = "MYTABLE";
$field_name = "ID";
$existing_field_value = "100";
$new_field_value = "101";
my $q = $dbh->prepare ("SELECT * FROM $table_name WHERE $field_name=?");
$q->execute ($existing_field_value);
my $rowdata = $q->fetchrow_hashref; # includes field names
$rowdata->{$field_name} = $new_field_value;
my $insq = $dbh->prepare ("INSERT INTO $table_name (" . join (", ", keys %$rowdata) .
") VALUES (" . join (", ", map { "?" } keys %$rowdata) . ");";
$insq->execute (values %$rowdata);
Надеюсь, это поможет.