2012-03-19 56 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一起去,这是一种糟糕的设计。