私のテーブルにはTIME
フィールドがあります。
最新の5行だけを保持したい。
を使用せずに古い行を削除できますSELECT
か?
ロジックは次のようにする必要があると思います。
DELETE FROM tbl WHERE row_num > 5 ORDER BY TIME
SELECT
値のリストを取得するために使用するMySQLでこれを実装するにはどうすればTIME
よいですか?
適切な節がない場合、SQL 結果セットはunorderedORDER BY
と見なされる必要があります。
行のシーケンス番号を明示的に格納するには、列を提供する必要があります。これは、テーブルのタイム スタンプまたは auto_increment 列である可能性があります。
テーブルにも同時にアクセスできることに注意してください。あなたが削除している間に他の誰かが挿入している場合、どのような動作が予想されますか? 私が知る限り、これは「最新の 5 行」+「他のトランザクションで挿入された行」のみを保持する状況につながる可能性があります。
time
テーブルにその目的の列とPRIMARY KEY
(または他のUNIQUE NOT NULL
列) がある場合は、次のように記述できます。
DELETE tbl FROM tbl LEFT JOIN (SELECT * FROM tbl ORDER BY tm DESC LIMIT 5) AS k
ON (tbl.pk) = (k.pk)
WHERE k.`time` IS NULL;
複合主キーがある場合は、次の(a,b)
ように記述できます。
DELETE tbl FROM tbl LEFT JOIN (SELECT * FROM tbl ORDER BY tm DESC LIMIT 5) AS k
ON (tbl.a,tbl.b) = (k.a,k.b)
WHERE k.tm IS NULL;
DELETE FROM TBL
WHERE ROW_NUM = (SELECT ROW_NUM FROM TBL LIMIT 6, 99999)
ORDER BY TIME DESC;
これにより、6、7、8、9、10、.....、200005 からレコードが削除されます
ここでLIMIT範囲が 6 ~ 9999 レコードから始まるため、200005 を意味します。
多分これは代替案になるでしょう:
DELETE FROM tbl
WHERE primary_key NOT IN (SELECT primary_key
FROM tbl
ORDER BY time
DESC LIMIT 5)