2012-03-19 70 views
0

我想從xyz表中刪除錶行,其中行數應該大於10,但我沒有任何包含行位置的列。我不想添加其他列,如Id。這裏是我的表結構:如何根據行數刪除數據庫錶行

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

,這裏是我的查詢它會刪除整個表

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

我沒有得到什麼就寫,而不是(select Count(*) from questions)

任何解決方案?

回答

1

,我認爲這會工作:

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

這是假設名稱是唯一的。

+0

如果只有您使用LIMIT而不是TOP。 :)問題被標記爲MySQL。 – 2012-03-19 12:40:38

+0

感謝它的工作原理,但在sqlite中,我不得不寫這個東西而不是SELECT TOP:SELECT * FROM Table_Name LIMIT 5 – Dhanesh 2012-03-19 12:55:32

+0

啊,是的。我一直花費太多時間使用SQL Server ... :-) – 2012-03-19 13:07:30

1

另一種解決方案可能是在每個記錄上保留一個時間戳,並在新記錄進入時刪除最早的記錄。看起來奇怪的是,您對持久數據的需求太少。我想知道你的要求和你的設計。

0

創建具有相同方案的副本表說test2的

insert into test2 select * from test limit 10 

delete from test; 

insert into test select * from test2; 
0

製作2個假設:名字是你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行之後停止插入。你也可以有一個CHECK約束來強制你這樣做,儘管我不確定MySQL是否支持這種高級結構。
3)數字真的是10嗎?如果是這樣,你確定數據庫是你需要的存儲嗎?我得在這裏和@duffymo一起去,這是一種糟糕的設計。