70

id自動インクリメントと任意の数の列を持つテーブル「テスト」があります。

idもちろんを除いてすべての列が同じで、このテーブルの行のコピーを作成したいと思います。

すべての列に名前を付けずにこれを行う方法はありますか?

INSERT... SELECT... ON DUPLICATE KEYを作成しないことに気付くまでINSERT ON DUPLICATE、既存の行を更新するだけだと思いました。

4

6 に答える 6

112

テーブルに次のフィールドがあるとします。

( pk_id int not null auto_increment primary key,
  col1 int,
  col2 varchar(10)
)

次に、新しいキー値を使用してある行から別の行に値をコピーするには、次のクエリが役立つ場合があります

insert into my_table( col1, col2 ) select col1, col2 from my_table where pk_id=?;

これにより、フィールドの新しい値が生成され、 、および選択した行のpk_id値がコピーされます。col1col2

このサンプルを拡張して、テーブル内のより多くのフィールドに適用できます。

更新:
JohnP と Martin からのコメントに敬意を表して-

一時テーブルを使用して最初にメイン テーブルからバッファリングし、それを使用して再びメイン テーブルにコピーできます。一時テーブルの pk 参照フィールドを更新するだけでは、メイン テーブルに既に存在している可能性があるため、役に立ちません。代わりに、一時テーブルから pk フィールドを削除し、他のすべてをメイン テーブルにコピーできます。

参照された投稿のTim Ruehsenによる回答を参照

CREATE TEMPORARY TABLE tmp SELECT * from my_table WHERE ...;
ALTER TABLE tmp drop pk_id; # drop autoincrement field
# UPDATE tmp SET ...; # just needed to change other unique keys
INSERT INTO my_table SELECT 0,tmp.* FROM tmp;
DROP TEMPORARY TABLE tmp;

お役に立てれば。

于 2012-07-04T15:09:31.493 に答える
5

これは、MySQL のすべてのバージョンと Amazon RDS Aurora で機能します。

INSERT INTO my_table SELECT 0,tmp.* FROM tmp;

また

インデックス列を NULL に設定してから、INSERT を実行します。

しかし、MariaDB ではなく、バージョン 10 をテストしました。

于 2015-07-08T15:54:39.047 に答える
3

これは、1行のみを複製するために機能します

  • テーブルから 1 つの行を選択します
  • すべての連想をフェッチ
  • ID 行の設定を解除します (一意のインデックス キー)
  • array[0] キーを列名に分解する
  • array[0] の値を列の値に分解します
  • クエリを実行する

コード:

 $qrystr = "SELECT * FROM mytablename  WHERE id= " . $rowid;
 $qryresult = $this->connection->query($qrystr);
 $result = $qryresult->fetchAll(PDO::FETCH_ASSOC);
 unset($result[0]['id']); //Remove ID from array
 $qrystr = " INSERT INTO mytablename";
 $qrystr .= " ( " .implode(", ",array_keys($result[0])).") ";
 $qrystr .= " VALUES ('".implode("', '",array_values($result[0])). "')";
 $result = $this->connection->query($qrystr);
 return $result;

もちろん、 PDO:bindparam を使用して、攻撃に対して変数をチェックする必要がありますが、例を示します

追加情報

値の処理に問題がある場合は、NULL次のコードを使用implodingして、値が ではない名前と値のみを使用できますNULL

foreach ($result[0] as $index => $value) {
    if ($value === null) unset($result[0][$index]);
}
于 2014-05-26T20:02:34.973 に答える
-1
INSERT into table_name (  
    `product_id`, 
    `other_products_url_id`, 
    `brand`, 
    `title`, 
    `price`, 
    `category`, 
    `sub_category`, 
    `quantity`, 
    `buy_now`, 
    `buy_now_url`, 
    `is_available`, 
    `description`, 
    `image_url`, 
    `image_type`, 
    `server_image_url`, 
    `reviews`, 
    `hits`, 
    `rating`, 
    `seller_name`, 
    `seller_desc`, 
    `created_on`, 
    `modified_on`, 
    `status`) 
SELECT 
    `product_id`, 
    `other_products_url_id`, 
    `brand`, 
    `title`, 
    `price`, 
    `category`, 
    `sub_category`, 
    `quantity`, 
    `buy_now`, 
    concat(`buy_now_url`,'','#test123456'), 
    `is_available`, 
    `description`, 
    `image_url`, 
    `image_type`, 
    `server_image_url`, 
    `reviews`, 
    `hits`, 
    `rating`, 
    `seller_name`, 
    `seller_desc`, 
    `created_on`, 
    `modified_on`, 
    `status` 
FROM `table_name` WHERE id='YourRowID';
于 2015-11-27T13:04:43.430 に答える