id
自動インクリメントと任意の数の列を持つテーブル「テスト」があります。
id
もちろんを除いてすべての列が同じで、このテーブルの行のコピーを作成したいと思います。
すべての列に名前を付けずにこれを行う方法はありますか?
INSERT... SELECT... ON DUPLICATE KEY
を作成しないことに気付くまでINSERT ON DUPLICATE
、既存の行を更新するだけだと思いました。
id
自動インクリメントと任意の数の列を持つテーブル「テスト」があります。
id
もちろんを除いてすべての列が同じで、このテーブルの行のコピーを作成したいと思います。
すべての列に名前を付けずにこれを行う方法はありますか?
INSERT... SELECT... ON DUPLICATE KEY
を作成しないことに気付くまでINSERT ON DUPLICATE
、既存の行を更新するだけだと思いました。
テーブルに次のフィールドがあるとします。
( 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
値がコピーされます。col1
col2
このサンプルを拡張して、テーブル内のより多くのフィールドに適用できます。
更新:
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;
お役に立てれば。
これは、MySQL のすべてのバージョンと Amazon RDS Aurora で機能します。
INSERT INTO my_table SELECT 0,tmp.* FROM tmp;
また
インデックス列を NULL に設定してから、INSERT を実行します。
しかし、MariaDB ではなく、バージョン 10 をテストしました。
コード:
$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]);
}
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';