1

行の総数を 50,000 以内に抑える必要があるテーブルがあります。このテーブルには Id フィールドが含まれています (id は自動インクリメンタルです)。

かどうかを確認してmax(id) - min(id) > 50,000から、以前の行を削除するにはどうすればよいですか?

DELETE FROM news WHERE if (max(id) - min(id) > 50000) 

次の場合、これqueryはすべての行を削除しmax(id) - min(id) > 50000ます。正しい方法は何ですか? 理想的には、SSH メソッドの言い訳として、1 行のコマンドが必要です。ありがとう。

4

3 に答える 3

4
DELETE d 
FROM news AS d
  JOIN
    ( SELECT MAX(id)-50000 AS lim 
      FROM news
    ) AS m
    ON d.id < m.lim ;

もちろん、idシーケンスにギャップがある可能性があるため、上記は正確に50K行を残すことはありません。しかし、これは想定内であり、問​​題ではないと思います。本当に正確に 50K 行を残したい場合は、どのステートメントもおそらく効率が低下します。これを試すことができます:

DELETE d 
FROM news AS d
  JOIN
    ( SELECT id AS lim 
      FROM news
      ORDER BY id DESC
      LIMIT 1 OFFSET 50000
    ) AS m
    ON d.id <= m.lim ;
于 2013-01-04T09:24:17.677 に答える
2
Delete from news where id < max(id)-50000
于 2013-01-04T09:24:01.590 に答える
2
DELETE FROM news 
WHERE id NOT IN (SELECT id FROM news ORDER BY id DESC LIMIT 50000)
于 2013-01-04T09:34:56.827 に答える