LoginSignup
3
1

More than 3 years have passed since last update.

PostgreSQLで件数を指定してDeleteしようとするとハマった話

Posted at

PostgreSQLで件数を指定してDeleteしようとするとハマった話

100000件入ったテーブルから任意のN件を削除する時のレスポンスを計測したかった。

Limit句で件数指定できるしいけるだろーと思って軽率に試したら、意外とハマったのでメモをしておく。

環境:Windows10 1909, PostgreSQL10.0

テーブルレイアウトはコレ

CREATE TABLE shohin_table (
    id numeric NOT NULL,
    code character varying(2) NOT NULL,
    name character varying(10),
    toroku_time timestamp without time zone
);
ALTER TABLE ONLY shohin_table
    ADD CONSTRAINT shohin_table_pkey PRIMARY KEY (id, code);

そして最初に書いたのがコレ

--1
delete from shohin_table
where 
    (select id,code,name,toroku_time
    from shohin_table
    order by toroku_time
    limit 1000)
ERROR:  副問い合わせは1列のみを返さなければなりません
LINE 3: (select id,code,name,toroku_time

実行するとエラーが出る...なぜダメなんだ

追加で調べると、where句の指定では項目を指定しなければいけないらしいことがわかったのでもう一回

--2
delete from shohin_table
where toroku_time in
    (select id,code,name,toroku_time
    from shohin_table
    order by toroku_time
    limit 1000)
ERROR:  副問い合わせの列が多すぎます
LINE 2: where toroku_time in

実行するとエラーが出る...なぜだ

もう一度サンプルを見直してダメポイントを発見!ここだ。

--2
 --中略--
    (select id,code,name,toroku_time
 --中略--

どうやらwhere句で指定した項目のみをSelectしないといけないらしい。
(SQLを理解しないまま使った結果。。)

よって最終版ができました。コレ

--3
delete from shohin_table
where toroku_time in
    (select toroku_time
    from shohin_table
    order by toroku_time
    limit 1000)

これで指定したカラムで並び替えた結果をN件削除することができた。:relaxed:

気になってるのは並び替えずにInsert順でそのまま削除する時はどーするんだろうという話(調べてない)

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1