mysqlでクエリすることができますselect * ... LIMIT 10, 30
10はスキップするレコードの数を表します。どのようにmysqlのn番目の行の後にすべてのレコードを削除するには?
誰も私が最初の10レコードの後のすべてのレコードが削除される削除ステートメントで同じことを行う方法を知っていますか?
mysqlでクエリすることができますselect * ... LIMIT 10, 30
10はスキップするレコードの数を表します。どのようにmysqlのn番目の行の後にすべてのレコードを削除するには?
誰も私が最初の10レコードの後のすべてのレコードが削除される削除ステートメントで同じことを行う方法を知っていますか?
(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;
いくつかの質問:このようなテーブルを変更するときに 'auto_increment'を追加する方法を定義していますか?それが必要な順序に保たれているかどうか、もしそうならテストする:これは "偶然"か定義された行動ですか?また:mysqlは列を削除した後に 'auto_increment'をリセットしますか?そうでない場合は、明示的に設定するか、カウントを続けることができます。そして最後に、これが大きなテーブルのためにどのようになるのでしょうか? – Nanne
'auto_increment_increment'が1でない場合(マルチマスター設定時)、これは正しく動作しません。また、テーブルが大きい場合は実行に時間がかかります。 –
以下はで、の作業になります。
しかし、これは以下となります。
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
「うまくいかない」の理由は、同じテーブルが直接言及されているということだと思います。 –
、これは効率的なトリックです:
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.
あなたのキーである何表? –
GUID文字列です。 – Roman
この削除された答えは、私が思うに言及する必要があります: 'テーブルからの削除ID(SELECT ID FROM TABLE LIMIT 10、30)'。 @Amは、 "このバージョンのMySQL"では動作しないとコメントしています。したがって、質問に対する答えではありませんが、それは他の回答者には役に立ちます:) – Nanne