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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

3921閲覧

postgresql で、古いレコードを10000レコード削除する方法について

ctk

総合スコア31

PostgreSQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

2クリップ

投稿2019/08/10 08:12

いつもお世話になっております。

早速ですが、1点質問が御座います。
postgresql で、古いレコードを10000レコード削除したいのですが、
以下のSQL文を実行すると、
delete from access_logs order by id asc limit 10000;

次のエラーメッセージが表示されてしまいます。

ERROR: syntax error at or near "order"
LINE 1: delete from access_logs order by id asc limit 10000;
^

********** エラー **********

ERROR: syntax error at or near "order"
SQLステート:42601

postgresqlで、
古い順にレコードを削除する方法をご存知でしたらご教示頂けないでしょうか。

以上です、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

DELETE文自体にORDER BYは使えません。
DELETE

WHEREでSELECTした結果を入れるとかでしょうか。

※未検証

SQL

1DELETE 2 FROM access_logs 3WHERE id IN ( 4 SELECT 5 ID 6 FROM access_logs 7 ORDER BY id ASC 8 LIMIT 10000 9 )

INはさすがに重いかな。
イメージはとりあえずこんな感じで。

投稿2019/08/10 08:19

m.ts10806

総合スコア80765

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

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

m.ts10806

2019/08/10 08:51

手元にPostgreSQL環境なかったのでとりあえずMySQLの構文チェッカーで動かしたらエラーでなくて焦ったのはナイショです。
ctk

2019/08/10 11:14

m.ts10806様 早速、ご回答頂き誠にありがとうございます。 アクセスが少ない夜中に実行してみます。 以上です、引き続き、よろしくお願い致します。
m.ts10806

2019/08/10 11:18

そうですね。 それかテストテーブルとテストデータつくって少ない件数で試した方が良いかもしれないです。 念のため実行計画もとっておくとパフォーマンスがでなかったときの対応もしやすくなるかもしれません
ctk

2019/08/10 23:03

いつもお世話になっております。 「delete from access_logs where id in (select id from access_logs order by id asc limit 10);」で実行してみた所、 「クエリーは、成功しました: 163133 行の影響があり, 実行時間は、271533 ミリ秒でした。」となりました。 思いのほか時間がかかったのと、アクセスログしか管理していないので、テーブル内のレコードを全て削除してみたいと思っております。 ちなみに、全削除の時は、TRUNCATE access_logs が宜しいでしょうか。
m.ts10806

2019/08/10 23:49

ちょっと確認してもらいたいのが、 select id from access_logs order by id asc limit 10 の件数です。count(id)で確認してみてください。 >全削除の時は、TRUNCATE access_logs が宜しいでしょうか。 はいtruncateで良いです。
ctk

2019/08/10 23:57 編集

早速、ご返信頂きありがとうございます。 access_logテーブルのレコード数は、12451749レコードほど御座いました。
m.ts10806

2019/08/10 23:58

あいえ、そうではなく、下記を実行した結果です。 select id from access_logs order by id asc limit 10 一応ちゃんと10件だけなのかなと。 「 163133 行の影響があり」という結果が気になっています。
ctk

2019/08/11 00:34 編集

ご連絡ありがとう御座います。 私も、10件だけかと思いましたが、「 163133 行の影響があり」と表示されて、何でかなぁ?と疑問に思っておりました。 私が無知で申し訳ないのですが、 select id from access_logs order by id asc limit 10 を select count(id) from access_logs order by id asc limit 10 にする形でしょうか。
m.ts10806

2019/08/11 01:21

ごめんなさい。いろいろ振りすぎましたね。ややこしくなりそうなので select id from access_logs order by id asc limit 10 の実行結果だけ確認してもらえればと。
ctk

2019/08/11 03:29

こちらこそ、色々とご教示頂き、誠にありがとうございます。 「select id from access_logs order by id asc limit 10」 の結果は、 「クエリー全体 実行時間:165642 ms. 10 行検索しました」 となりまして、10行のみが出力されました。 「 163133 行の影響があり」と表示されたのは、 access_logsのテーブルに他のテーブルも関連していたなどが原因でしょうか。
m.ts10806

2019/08/11 03:40

いえ、ないと思います。テーブルは1つしか指定していないですし。
m.ts10806

2019/08/11 03:41

ただ、本当に指定した件数だけdeleteされていたのでしたら処理としてはOKです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問