MySQL(MariaDB)でレコードのコピー、複製を行う方法を調べてみた。
ここで紹介する方法を使うと、primary keyの重複を避けて行うことが出来ます。
目次
MySQLでレコードコピーするとDuplicate entry
まず、普通にレコードのコピーを行ってみました。
1 2 |
MySQL > insert into TABLE1 select * from TABLE1 where id=1; ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' |
Duplicate entry for key 'PRIMARY'
なるほど、1行をまるまるinsertしようとしてもプライマリキー(primary key)が重複するか。
当然の結果。
対策を考えてみました。
プライマリキーを重複しないようにレコードをコピーする方法
プライマリキーのカラム (id) 以外のカラム名をすべて列挙する
1 |
MySQL > insert into TABLE1 select a,b,c,d,e,f,g from TABLE1 where id=1; |
やり方としては、あまり賢い方法ではないが、確実にできる。
カラムが多くなると、列挙するのが大変になる。
テンポラリテーブルを作成して、プライマリキーのカラム (id)を削除してInsert、idは0を指定。
1 2 3 4 |
MySQL > CREATE TEMPORARY TABLE tmp1 SELECT * from TABLE1 where id=1; MySQL > ALTER TABLE tmp1 drop id; MySQL > INSERT INTO TABLE1 SELECT 0,tmp1.* FROM tmp1; MySQL > DROP TABLE tmp1; |
これは論理的に考えれば、理解しやすくて簡単。
idとして0を insert すれば、プライマリキーは自動生成されます。
スマートでおすすめな方法です。
CREATE TEMPORARY TABLE は、MySQLで使える一時テーブルです。
これは利用しているセッション内だけで有効なテーブルを作成し、セッションが閉じたときに自動的にテーブルが削除される構文になります。
上記の例では、テンポラリテーブルをDROPしていますが、セッション終了後に自動的に削除されるために削除し忘れを避けることが可能です。
コメント