2011-07-03 13 views
8

mysqlでクエリすることができますselect * ... LIMIT 10, 30 10はスキップするレコードの数を表します。どのようにmysqlのn番目の行の後にすべてのレコードを削除するには?

誰も私が最初の10レコードの後のすべてのレコードが削除される削除ステートメントで同じことを行う方法を知っていますか?

+0

あなたのキーである何表? –

+0

GUID文字列です。 – Roman

+0

この削除された答えは、私が思うに言及する必要があります: 'テーブルからの削除ID(SELECT ID FROM TABLE LIMIT 10、30)'。 @Amは、 "このバージョンのMySQL"では動作しないとコメントしています。したがって、質問に対する答えではありませんが、それは他の回答者には役に立ちます:) – Nanne

答えて

8

(Oracleの中のような)のMySQLにはrowIdはありません考えると、私は次のことをお勧めします:

alter table mytable add id int unique auto_increment not null; 

これは自動的に条件や注文ごとなしselect文の順序であなたの行に番号を付けるだろう。

select * from mytable; 

はその後、順番を確認した後、ニーズ(そしておそらく、テーブルのダンプ)と一致している

delete from mytable where id > 10; 

最後に、あなたはそのフィールドに

alter table mytable drop id; 
+0

いくつかの質問:このようなテーブルを変更するときに 'auto_increment'を追加する方法を定義していますか?それが必要な順序に保たれているかどうか、もしそうならテストする:これは "偶然"か定義された行動ですか?また:mysqlは列を削除した後に 'auto_increment'をリセットしますか?そうでない場合は、明示的に設定するか、カウントを続けることができます。そして最後に、これが大きなテーブルのためにどのようになるのでしょうか? – Nanne

+0

'auto_increment_increment'が1でない場合(マルチマスター設定時)、これは正しく動作しません。また、テーブルが大きい場合は実行に時間がかかります。 –

2
を削除することがあり

以下はで、の作業になります。

しかし、これは以下となります。

DELETE 
FROM table_name 
WHERE id IN 
    (SELECT id 
    FROM 
     (SELECT id 
     FROM table_name 
     ORDER BY   --- whatever 
     LIMIT 10, 30 
    ) AS tmp 
) 

そして、あまりにもこの:行の多くを削除する場合

DELETE table_name 
FROM table_name 
    JOIN 
    (SELECT id 
     FROM table_name 
     ORDER BY   --- whatever 
     LIMIT 10, 30 
    ) AS tmp 
    ON tmp.id = table_name.id 
+0

「うまくいかない」の理由は、同じテーブルが直接言及されているということだと思います。 –

0

、これは効率的なトリックです:

CREATE TABLE new LIKE real; -- empty table with same schema 
INSERT INTO new SELECT * FROM real ... LIMIT 10; -- copy the rows to _keep_ 
RENAME TABLE real TO old, new TO real; -- rearrange 
DROP TABLE old; -- clean up. 
関連する問題