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件削除することができた。
気になってるのは並び替えずにInsert順でそのまま削除する時はどーするんだろうという話(調べてない)