0

INSERT次のようなMySQL を使用する方法はありますか。

INSERT INTO doc_details SELECT * FROM doc_details WHERE dd_id = 1

主キーが繰り返されており、列を拡張するのに非常に時間がかかる可能性があるため、これは機能しません。

last_insert_idこれの目的は、後で変更される同じテーブル内の行を複製し、新しいレコードを取得することです。したがって、これを行う他の方法のアイデアも高く評価されます。

ありがとう。

4

4 に答える 4

1

複製する列に名前を付けて、主キーを省略します。

INSERT INTO doc_details (col1, col2, col3)
SELECT col1, col2, col3 
FROM doc_details 
WHERE dd_id = 1
于 2012-11-29T13:09:37.393 に答える
0

IDAUTO_INCREMENT オプションを使用してフィールドを作成し、挿入時に NULL 値を使用することをお勧めします-

INSERT INTO doc_details(id, column1, column2)
  SELECT NULL, column1, column2 FROM doc_details WHERE dd_id = 1;

この場合、古いIDものは新しいものに変更されます。

于 2012-11-29T13:08:31.777 に答える
0

古いレコードからコピーする一時テーブルに依存し、キー フィールドの値を省略できます。
繰り返し値を省略するには、少なくとも 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で同様の投稿に対する私の回答を参照することもできます。

于 2012-11-29T14:19:05.847 に答える
0

答えてくれてありがとう。本当に感謝。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 ソリューションを提供しました。

ありがとうございます!

于 2012-12-05T11:14:07.963 に答える