ページ

2014年1月19日日曜日

postgresで重複レコードを削除しよう

毎回忘れるのでメモ対応
CREATE TABLE new_table as select distinct * from old_table;

これだと毎回面倒なのでシェル化してみました
#/bin/sh
DATABASE=$1
TABLE=$2
TMP_TABLE="$2_tmp"
BK_TABLE="$2_bk"
psql -c "CREATE TABLE $TMP_TABLE as select distinct * from $TABLE;" -U postgres $DATABASE
psql -c "CREATE TABLE $BK_TABLE as select * from $TABLE;" -U postgres $DATABASE
psql -c "DROP TABLE $TABLE" -U postgres $DATABASE
psql -c "ALTER TABLE $TMP_TABLE RENAME TO $TABLE" -U postgres $DATABASE

方法としては、distinctを利用し結果がユニークになることを利用し

テーブルのコピーを行い再度戻す対応となります

念のためバックアップも作成していますが、こちらは不要なら消すべきかと
PKが存在する系では、難しいかも知れませんが中間テーブルなどでは便利な手法です。