0

私がやりたかったのは、この関数を使用してテーブルから N 個の最も古い ID を削除することです。

def deleteOldRows(size: Int)(implicit s: Session): Int =
  MyTable.sortBy(_.id.asc).take(size).delete

SlickExceptionこの操作は、理由をスローします

DELETE ステートメントのクエリは、単一のテーブルを含む理解に解決する必要があります -- サポートされていない形状: 理解 (フェッチ = なし、オフセット = なし)

ドキュメントにも記載されているように:

削除するためのクエリは、単一のテーブルからのみ選択する必要があります。プロジェクションは無視されます (常に行全体が削除されます)。

複数のテーブルをトリガーしているのは何ですか? sortBy句が結果を格納する一時テーブルを作成するためですか? とりあえず、クエリを次のように書き直しました。

MyTable.sortBy(_.id.asc).take(size).list().map(result => MyTable.filter(_.id === result.id).delete)

基本的にIDを取得し、1つのフィルターと削除ごとに、複数の行を一度に削除するためのより読みやすく直接的な方法はありますか?

4

1 に答える 1

2

試してみてくださいMyTable.filter(_.id in MyTable.sortBy(_.id.asc).take(size).map(_.id)).delete。今すぐ詳細を確認せずに、エラー メッセージが誤解を招くものであり、その原因が ORDER BY と LIMIT が DELETE でサポートされていないことだと思います。

チケットを作成しました: https://github.com/slick/slick/issues/872

于 2014-06-29T12:27:01.760 に答える