MySQLでレコードをコピーする(primary keyが重複しないように)

MySQLで既存レコードをコピーしたい場合がある。 しかし、PRIMARY Keyがあるテーブルのレコードをコピーするときに、次のようなSQLではPRIMARY Keyが重複してしまいエラーになる。

INSERT INTO tablename SELECT * FROM tablename where id=273;
/* SQL エラー  (1062): Duplicate entry '273' for key 'PRIMARY' */

良い方法がないか調べてみた。

  • 方法1 PRIMARY Keyのカラム(id)以外のカラム名を列挙しする。(カラムが多いとちょっと面倒。)
  • 方法2 一度テンポラリテーブルを作成して、PRIMARY Keyのカラム(id)を削除してInsertする。idには0を指定している。
CREATE TEMPORARY TABLE tmp SELECT * from tablename where id=273;
ALTER TABLE tmp drop id;
INSERT INTO tablename SELECT 0,tmp.* FROM tmp;
DROP TABLE tmp;

なるほど、手動でSQLを実行する場合にはとくに便利なので覚えておこう。

参考

Duplicate / Copy records in the same MySQL table - Stack Overflow