2012-03-15 11 views
0

エンティティをキャッシュするためにデータベースが使用されています。テーブルは次のようになります。LRUキャッシュのSQL/HQL DELETEステートメント?

| Persons    | Addresses 
-----------------  -------------- 
PK| id   <--| PK| id 
    | last_accessed |--- FK| persons_id 
    | [some]     | [more] 
    | [other]    | [address] 
    | [data]     | [stuff] 

人はゼロ以上のアドレスを持っています。これらのテーブルは、Hibernateを使用するJavaアプリケーションによってアクセスされます。また、JDBC over SQLを使用して同じアプリケーションから直接アクセスされます。

Personsテーブルのサイズを固定値(たとえば、50,000レコード)に調整する必要があります。これを行うには、私は最も古いレコード(last_accessedに基づいて)を削除する必要があります。

これは簡単に行うことができるANSI-SQLまたはHQLクエリですか?純粋なANSI-SQLソリューションは理想的です。

  • 私たちはデータベースにとらわれないままにしようとしています。我々は、カスケードは仕事に削除休止状態を取得するために、アプリケーションのメモリにオブジェクトをロードすることを避けるためにしたい
  • ...

答えて

1

これは純粋なANSIのSQLです:

DELETE FROM addresses 
WHERE persons_id IN ( 
    SELECT id 
    FROM ( 
     SELECT id, 
      row_number() over (order by last_accessed desc) as rn 
     FROM persons 
    ) t 
    WHERE rn <= 50000 
); 

DELETE FROM persons 
WHERE id IN ( 
    SELECT id 
    FROM ( 
     SELECT id, 
      row_number() over (order by last_accessed desc) as rn 
     FROM persons 
    ) t 
    WHERE rn <= 50000 
); 

別の方法を定義することですFK制約を "ON DELETE CASCADE"としてから、personsテーブルから行を削除するだけです。それは最初にアドレスを削除する余分なSQLを取り除くでしょう。

+0

aha!私はROW_NUMBERがANSI SQL標準の一部であることに気づいていませんでした。 TIL ... –

関連する問題