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

SQL
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を指定している。

SQL
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