2012-03-19 18 views
0

xyzテーブルから行数を10より大きくする必要があるテーブル行を削除したいが、行位置を保持する列がない。私はIdのような追加の列を追加したくありません。ここに私のテーブルの構造は次のとおりです。行数に応じてデータベーステーブル行を削除する方法

name(as text) subject(as text) filename(as text) 

、ここでは、私が(select Count(*) from questions)

任意のソリューションの代わりに書くために何を得ていないのです

delete from questions where (select Count(*) from questions) between 10 and 20 

テーブル全体を削除し、私のクエリのですか?

答えて

1

を言う私はこれが仕事だと思う:

DELETE FROM table WHERE name NOT IN (SELECT TOP 10 name FROM table) 

これは、名前が一意であることを想定しています。

+0

TOPの代わりにLIMITを使用した場合のみ。 :)質問はMySQLにタグ付けされています。 –

+0

ありがとう、それは動作しますが、sqliteで私はSELECT TOPの代わりにこのことを書いていました:SELECT * FROM Table_Name LIMIT 5 – Dhanesh

+0

ああ、はい。私はSQL Serverを使ってあまりにも多くの時間を費やしてきました。:-) –

1

別の解決方法は、各レコードにタイムスタンプを維持し、新しいレコードが入ったときに最も古いレコードを削除することです。永続化したデータがほとんど必要ないことは奇妙なことです。私はあなたの要件とあなたのデザインが不思議です。

0

同じスキームでレプリカ表を作成しますが、test2は

insert into test2 select * from test limit 10 

delete from test; 

insert into test select * from test2; 
0

MySQLが行IDを提供していますが、このスレッドへの答えに投稿されたとして、セッション変数を使用して回避策があるように思われません:2つの仮定を作るEquivalent of Oracle’s RowID in MySQL

0

:名前はidカラムであり、あなたがしたいです名前順。それを行うには

一つの方法は、に次のようになります。

DELETE FROM Xyz WHERE name NOT IN (SELECT name FROM Xyz ORDER BY name LIMIT 10); 

しかし、それはおそらくあなたを与える:

:あなたは、一時テーブルを使用することができることへの回避策として

ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 

CREATE TEMPORARY TABLE temp SELECT * FROM Xyz ORDER BY name LIMIT 10; 
DELETE FROM Xyz WHERE name NOT IN (SELECT name FROM temp); 
DROP TABLE temp; 
0

これは奇妙です。

1)なぜ追加の列を必要としませんか?
2)削除したい行はどれですか?名前、件名、またはファイル名を選択しない限り、にはに追加の列が必要です。
2a)削除する行が問題でない場合は、10行後に挿入を停止することができます。 MySQLがこのような構造をサポートしているかどうかわかりませんが、これを強制するCHECK制約を設定することもできます。
3)数字は実際に10ですか?もしそうなら、あなたはこれに必要なストレージをデータベースであると確信していますか?私はここで@duffymoと一緒に行かなければならない、これは悪いデザインの匂いがする。

関連する問題