質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
phpPgAdmin

phpPgAdminは、PHPで作成された複数のPostgreSQLデータベースをブラウザから簡単に管理・操作できるツール。テーブルの作成や参照を始め、データのバックアップやリストアといった操作が可能になります。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

5回答

26963閲覧

重複したレコードを1件だけ残して削除したい

chibi_kuma

総合スコア85

phpPgAdmin

phpPgAdminは、PHPで作成された複数のPostgreSQLデータベースをブラウザから簡単に管理・操作できるツール。テーブルの作成や参照を始め、データのバックアップやリストアといった操作が可能になります。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

4グッド

3クリップ

投稿2016/10/27 07:34

postgreSQL(ver9.3.5)のデータベースを、phpPgAdmin(ver5.1)で操作しています。

phpPgAdmin でテーブルを表示させた時、
操作欄(編集ボタン/削除ボタン)が付くテーブルと付かないテーブルとがあり、
原因を調べてみた所、操作欄が無いテーブルには「プライマリキー」が
設定されていない事が原因と分かりました。

phpPgAdmin

そこで早速、プライマリーキーを追加してみたところ、
レコードが重複しているというエラーが出て、
プライマリーキーを追加することが出来ませんでした。

SELECT文で確認してみると、
確かにレコードが重複していて、
しかも全フィールド内容が一致してしまっています。
あちゃー。

テーブル名 order_progress_table -------------------------------------------------------- id order_num progress_info processing_date -------------------------------------------------------- 19314 08071401 4 2008-07-14 09:25:15.423073 19314 08071401 4 2008-07-14 09:25:15.423073 19314 08071401 4 2008-07-14 09:25:15.423073 --------------------------------------------------------

1件だけレコードを残して削除したいのですが、
以下のSQL文だと、全て消えてしまいそうです。

DELETE FROM order_progress_table WHERE ID = 19314;

どのようにすれば、1件だけ残して削除することが出来ますでしょうか?

AketiJyuuzou, garasya, Yuusai👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

既に解決済みのようですが、中間テーブルを用いない方法として以下のようなSQLをご紹介します。
⇒参考
IDをプライマリキーにしたい場合(IDが重複するデータを1つのみ残して削除する)

DELETE FROM order_progress_table USING ( SELECT id, max(ctid) AS ctid FROM test GROUP BY id ) AS X WHERE X.id = order_progress_table.id AND X.ctid <> order_progress_table.ctid ;

投稿2016/11/01 05:28

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

PostgreSQL9.1の新機能の「WITH句とINSERT,UPDATE,DELETEを同時に」
http://lets.postgresql.jp/documents/technical/9.1/1#writable-cte
を見ながらPostgreSQL9.5で作ってみました :-)

sql

1with tmp as(delete from order_progress_table Returning *) 2Insert Into order_progress_table select distinct * from tmp;

投稿2016/10/28 21:26

AketiJyuuzou

総合スコア1147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

PostgreSQLにはWITH句で、削除しながらを削除データを別テーブルに書き出せる例が掲載されていました。
削除後に、別テーブルのデータを一意化して 元のテーブル戻す(INSERT)すれば解決ですね。
よくかんがえたら、別にWITH句使わなくてもできますね。
削除予定分を別テーブルに取り出してから、削除すれば同じことですから、、、

投稿2016/11/01 21:39

編集2016/11/01 21:50
km668

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

良いコマンドが思いつかないのでとりあえずのSQL

sql

1create temp table tmp_order_progress_table as select distinct * from order_progress_table; 2truncate table order_progress_table; 3insert into order_progress_table select * from tmp_order_progress_table;

3ステップも必要です。

念の為に実行前に

pg_dump -U user -t order_progress_table db > order_progress_table.dmp

を行ってからです。

投稿2016/10/27 07:59

編集2016/10/27 08:23
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chibi_kuma

2016/10/27 08:41

A.Ichi さん、ありがとうございます!! すごいです! 一回でやろうとすると難しいけれど、段階を踏めばシンプルに出来るんですね。 なにやら小難しいことばかり考えていておりました。 自分の知らないコマンドもあり、勉強になりました。 DBにコマンドラインではアクセスが出来なかったので、pg_dumpはできませんでした。 phpPgAdminでテーブルをエクスポーtトしてからやりました。 そこまでケアしていただき、感謝です。 ありがとうございました。またよろしくお願い致します。
guest

0

MySQLなら LIMIT 区で1個ずつできます。
1個ずつなので個数が多い場合は、他の方法。
CREATE TABLE temp.chk (f1 VARCHAR(8), f2 VARCHAR(8));
INSERT INTO temp.chk values('0001','abc'),('0001','def');
DELETE FROM temp.chk WHERE f1='0001' LIMIT 1;
SELECT * FROM temp.chk;
件数が多い場合は、一旦外部ファイルに書き出す
SELECT DISTINCT * FROM temp.chk INTO OUTFILE '/temp/chk.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
TRUNCATE TABLE temp.chk;
LOAD DATA LOCAL INFILE '/temp/chk.txt'
INTO TABLE temp.chk
CHARACTER SET utf8mb4 FIELDS ESCAPED BY '' TERMINATED BY ',' ENCLOSED BY '"' ;
PG_SQLにも対応する機能があっても良さそうですね。
別テーブルに書き出す。
CREATE TABLE temp.dmp SELECT DISTINCT * FROM temp.chk;
DROP TABLE temp.chk;
ALTER TABLE temp.dmp RENAME chk;

投稿2016/11/01 21:17

km668

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問