INSERT
次のようなMySQL を使用する方法はありますか。
INSERT INTO doc_details SELECT * FROM doc_details WHERE dd_id = 1
主キーが繰り返されており、列を拡張するのに非常に時間がかかる可能性があるため、これは機能しません。
last_insert_id
これの目的は、後で変更される同じテーブル内の行を複製し、新しいレコードを取得することです。したがって、これを行う他の方法のアイデアも高く評価されます。
ありがとう。
複製する列に名前を付けて、主キーを省略します。
INSERT INTO doc_details (col1, col2, col3)
SELECT col1, col2, col3
FROM doc_details
WHERE dd_id = 1
ID
AUTO_INCREMENT オプションを使用してフィールドを作成し、挿入時に NULL 値を使用することをお勧めします-
INSERT INTO doc_details(id, column1, column2)
SELECT NULL, column1, column2 FROM doc_details WHERE dd_id = 1;
この場合、古いID
ものは新しいものに変更されます。
古いレコードからコピーする一時テーブルに依存し、キー フィールドの値を省略できます。
繰り返し値を省略するには、少なくとも 1 つの名前付き列、つまりキー フィールド名を使用する必要があります。
次の例を参照してください。
CREATE TEMPORARY TABLE tmp SELECT * from doc_details WHERE dd_id = ?;
ALTER TABLE tmp drop pk_field_name_here; -- drop the key field for not repeating
INSERT INTO doc_details SELECT 0, tmp.* FROM tmp;
DROP TABLE tmp;
他のフィールド名は使用されていませんが、キー フィールド名がその値を省略していることがわかります。
Mysql: Copy row but with new idで同様の投稿に対する私の回答を参照することもできます。
答えてくれてありがとう。本当に感謝。INSERT
ほとんどの回答は列を指定しているため、「ステートメントではワイルドカードを使用できない」という追加の調査が行われました。選択、変更、および同じテーブルへの挿入
私は自分のアプリケーションでこれを別の方法で解決し、SELECT
次にPerl関数INSERT
で列を拡張しました。map
SELECT * FROM doc_details WHERE dd_id = 1
次に、Perl で、行を $data のハッシュ参照として使用します。
$data->{'dd_id'} = 0;
$columns = join(',', map {$_ .'='. $dbh->quote( $data->{$_} ) } keys %{$cdh} );
auto_increment 列が維持されている限り、列の構造/順序の変更に関係なく、行をコピーします。
私はそれが純粋な SQL ソリューションではないことを知っています - Ravinder は純粋な SQL ソリューションを提供しました。
ありがとうございます!