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