SQLiteで最も古いレコードの削除

このQ&Aのポイント
  • AndoroidでDBを使う際に最も古いレコードを削除するためのSQL文を作成する方法がわかりません。
  • テーブルTESTにはIDとVALUEというカラムがあり、最大で10件のレコードを保持します。
  • 11件目のデータが発生した場合、最も古い1件目のレコードを削除し、新しいデータをテーブルに保存する必要があります。しかし、作成したSQL文が正しくありません。
回答を見る
  • ベストアンサー

SQLiteで最も古いレコードのみの削除

AndoroidでDBを使うのですが、考える動作のSQL文が作成できません。 テーブルTESTは以下のカラムを持ちます  ・ID - primary key not null  ・VALUE - not null テーブルTESTは最大で10件のレコードを保持します、11件目のレコードが発生したら 最も古い1件目のレコードを削除してから、11件目のデータを新しい10件目のデータとして テーブルに保存します。 そのために「最も古いレコード1件のみを削除する」というSQLを作成したいのですが、 考えたSQL文が正しくないと怒られてしまいます。 delete from TEST as A, (select * from TEST LIMIT 1)as B where A.ID=B.ID; この動作を1つのSQL文で行うのは不可能なのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

NOT EXISTS条件はカッコ内のSELECT文でレコードが取得できないときにTRUEになります。 先ほどのSQLの、 >where not exists( >select * from Test as tb >where Test.ID > tb.ID); のSELECT文でTestテーブルから自レコードよりIDが小さいレコードを取得しています。 #tbはただのテーブル別名です。 #SQLiteだとDELETE対象のテーブルにはテーブル別名がつけられない(?)ようだったのでTestと指定しています。 レコードが取得できない = 自レコードのIDが最も小さい ということになります。 なんとなく分かっていただけますかね・・・

rinet8223
質問者

お礼

丁寧な解説ありがとうございます。 良く判りました! 自レコードより小さいIDが取得できなかったレコードが、最も小さいレコードなので、それを条件に削除するのですね。 教えていただかなければ絶対に、思いつかないSQL文でした。 ありがとうございました。

その他の回答 (1)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

「最も古い」という判断をする条件はなんなのでしょうか? IDが最も小さいもの、ということであれば delete from Test where not exists( select * from Test as tb where Test.ID > tb.ID); でいいと思いますが。

rinet8223
質問者

補足

解答ありがとうございます。 最も古いとは、一番最初に挿入されたレコードです。 IDはプライマリでシーケンス番号なので、IDが最も小さいものになります。 教えていただいたSQLを実行したら、期待した結果になったのですが、お恥ずかしい話、処理の理解ができません。 「where GPS_INFO.ID > tb.ID」とは何をしているのでしょうか?

関連するQ&A

  • 重複レコードの削除

    あるテーブル(ここではTESTというテーブルとします)の重複レコードを削除したいので、以下のようなストアド・プロシージャを作成しました。 SELET DISTINCT * INTO TEST2 FROM TEST DELETE FROM TEST SELECT * INTO TEST FROM TEST2 DROP TABLE TEST2 開発終了後、システムの都合上、テーブルの追加はできないことが発覚し、TESTテーブル上で重複レコードを削除しなくてはならなくなりました。 カーソル等を利用すれば重複削除できると思いますが、ほかにシンプルな方法で重複レコードを削除する方法はありませんか?

  • 別テーブルからSELECTした値を持つ行を削除するSQLは?

    削除 SQL がわかりません。 SQL-1 SELECT id FROM table2 WHERE date_in IS NULL; これで取得したidを持つレコード(別テーブル)を削除したいのですが、 どうすれば組み合わさるのでしょうか? DELETE FROM table1 WHERE id=???

  • すべてのテーブルのすべてのレコードを削除する方法

    データベースを扱うプログラムに対してユニットテストを行いたいと思っています。 それぞれのテストが終了するごとにすべてのテーブル内のすべてのレコードを削除したいのですが、 delete from table_a; delete from table_b; delete from table_c; ... のように書くと、外部キー制約に引っかかってしまい削除できないことがあります。 短いSQL文で複数のテーブル内のレコードをすべて削除する方法はないのでしょうか? よろしくお願いします。 ちなみに、私が現在使っているDBMSはPostgreSQL 8.1です。

  • sqlite3 空白レコードの削除(2)

    空白レコードの削除ができません。 ターミナルからは、delete from list where name is null;でうまくいくのですが phpからは削除できません ご教授おねがいいたします。 $st = $pdo->query("delete from list where name is null ");

    • 締切済み
    • PHP
  • sqliteへのデータ追加

    sql文で質問です。接続は1-29の表示を確認済み。 掲示板を作る練習をしているのですが、とりあえずpostなどのユーザーから受け取り値をdbに保存・表示する前に、自分で保存(カラムは左から順にid,name,sexになっていてidの1~29は埋まっている状態です。)・表示してみようと思いtest.dbのhumanテーブルに「データの追加」と表記している部分をテーブルに書き込み表示したいのですが、エラーは表示されないもののid30番にデータの追加ができておらず困っています。 データを追加する方法を教えてください。 <?php // 変数の初期化 $db = null; $sql = null; $res = null; $row = null; $db = new SQLite3("test.db"); // データの追加 $sql = 'INSERT INTO human( id, name, sex, ) VALUES ( 30, "吉川", "男", )'; // データの取得 $sql = 'SELECT * FROM human WHERE id BETWEEN 1 AND 50;'; $res = $db->query($sql); while( $row = $res->fetchArray() ) { echo '<ul>'.'<li>'. $row[0] . $row[1] .$row[2].'<li>'.'<ul>';} ?>

  • 1レコードのデータを複数行に分け通し番号を付ける

    Access2010にて、1レコードのデータを複数行に分け、追番毎に通し番号を付ける方法がわからず困っています。 テーブル1の様に、1レコードにはデータ格納するカラムが4つしかなく、同じ追番でデータが5個以上ある場合は、次のレコードに同じ追番を入力して5個目以降のデータを格納しているテーブルがあります。 テーブル1 追番 カラム1 カラム2 カラム3 カラム4 1 データ1 2 データ1 データ2 データ3 データ4 2 データ5 データ6 データ7 3 データ1 4 データ1 ・ ・ ・ これをテーブル2の様に1レコードにデータ1個づつ格納し、追番毎の番号を振りたいと思います。 テーブル2 追番 番号 データ 1 1 データ1 2 1 データ1 2 2 データ2 2 3 データ3 2 4 データ4 2 5 データ5 2 6 データ6 2 7 データ7 3 1 データ1 4 1 データ1 ・ ・ ・ クエリ1の様なユニオンクエリで近いかたち(テーブル3)にできたのですが、同じ追番で番号が1~4まで埋まったら、5以降の番号を降る方法が分かりません。 クエリ1 SELECT 追番, 1 AS 番号, カラム1 AS データ FROM テーブル1 WHERE カラム1 Is Not Null UNION ALL SELECT 追番, 2 AS 番号, カラム2 AS データ FROM テーブル1 WHERE カラム2 Is Not Null UNION ALL SELECT 追番, 3 AS 番号, カラム3 AS データ FROM テーブル1 WHERE カラム3 Is Not Null UNION ALL SELECT 追番, 4 AS 番号, カラム4 AS データ FROM テーブル1 WHERE カラム4 Is Not Null; テーブル3 追番 番号 データ 1 1 データ1 2 1 データ1 2 1 データ5 2 2 データ2 2 2 データ6 2 3 データ3 2 3 データ7 2 4 データ4 3 1 データ1 4 1 データ1 ・ ・ ・ よろしくお願いします。

  • 削除するレコードを含んだテーブルを指定してください

    DELETE テーブルA.店名, メインテーブル.店名 FROM メインテーブル RIGHT JOIN テーブルA ON メインテーブル.店名 = テーブルA.店名 WHERE (((メインテーブル.店名) Is Null)); というSQL分で、メインテーブルにないけど、テーブルAにはある、店名を削除しようとしたら、 「削除するレコードを含んだテーブルを指定してください。」 となってしまいます。 実際は30レコードくらいあります。 なぜ、削除できないのでしょうか?

  • 日付型項目のNULLについて(PostgreSQL)

    よろしくお願いします。 下記内容のtest_tableを作成して ---- CREATE TABLE "test_table" ( "id" varchar(10) NOT NULL, "fdate" date ); ---- 下記内容のデータを登録しました。 ---- insert into test_table(id,fdate) values ('abc',NULL); ---- 下記のsqlでデータを取得できませんでした。 どうしてでしょうか? select * from test_table where fdate = NULL;

  • 条件をつけてレコードを取得したい

    以下のようなA,Bテーブルから条件を指定してレコードを取得したい 【Aテーブル】 ID Bテーブル番号 0001      null 0002      null 0003      null 【Bテーブル】 シーケンス番号   ID    登録日 処理済みフラグ       0010  0001 2014/01/01        0       0011  0001 2014/01/02        1       0012  0001 2014/01/03        0 <結果> 【Aテーブル】 ID Bテーブル番号 0001     0001 0002     null 0003     null 条件としては以下の条件です。 (1)Aテーブルは全レコード出力する (2)BテーブルのAテーブルシーケンス番号が複数存在する場合、登録日が一番古いレコードを抽出する (3)Bテーブルの処理済みフラグが0のレコード以外はnullとする。 自分で抽出条件を作成したのですが、Aテーブルの0001分しか上手く抽出出来ませんでした。 SELECT * FROM Aテーブル AT (SELECT シーケンス番号, MIN(登録日) AS 登録日 FROM Bテーブル GROUP BY AテーブルID) BT1, (SELECT * FROM Bテーブル) BT2 WHERE AT.ID = BT1.ID AND BT1.登録日 = BT2.登録日 AND BT1.ID = BT2.ID AND BT2.処理済みフラグ = '0' 一度上の命令文でテーブルを作って元のテーブルとマッチングさせるしかないのでしょうか?出来れば一発で抜き出したいです。 ご教授宜しくお願いします。

  • レコードが追加できない

    SQL-Server2010を使用しています。 レコードを追加する際にキー項目が存在する場合は追加しないようなSQL文を作成しました。 追加するテーブルにレコードが1件以上あれば思ったとおりの処理となりますが、 1件も存在しない場合は追加できません。 下記がそのSQL文です。 原因と対策方法を教えて頂けませんでしょうか? INSERT INTO foo(商品コード, 商品名) SELECT DISTINCT 'ABC123' , 'りんご' FROM foo WHERE NOT EXISTS( SELECT * FROM foo WHERE 商品コード = 'ABC123' ) 以上です。 宜しくお願い致します。