我希望能够将mySQL数据库表中重复记录的数量限制为2。
(不包括自动增量的id
字段)
我的表格设置为
id city item
---------------------
1 Miami 4
2 Detroit 5
3 Miami 4
4 Miami 18
5 Miami 4
因此在该表中,只删除第5行。
我该怎么做?
答案 0 :(得分:3)
MySQL在读取和写入同一个表时有一些缺陷。所以我实际上并不知道这是否可行,SQL的许多实现中的语法都很好,但我不知道它是否对MySQL友好...
DELETE
yourTable
WHERE
1 < (SELECT COUNT(*)
FROM yourTable as Lookup
WHERE city = yourTable.city AND item = yourTable.item AND id < yourTable.id)
修改强>
令人惊讶的复杂,但值得一试?
DELETE
yourTable
FROM
yourTable
INNER JOIN
(
SELECT
id
FROM
(
SELECT
id
FROM
yourTable
WHERE
1 < (SELECT COUNT(*)
FROM yourTable as Lookup
WHERE city = yourTable.city AND item = yourTable.item AND id < yourTable.id)
)
AS inner_deletes
)
AS deletes
ON deletes.id = yourTable.id
答案 1 :(得分:1)
我认为你的问题是你的代码和/或表结构都允许插入重复项,而你应该在真正修复数据库和/或代码时提出这个问题。
答案 2 :(得分:0)
我认为更好的解决方案是避免允许超过5个寄存器,你必须实现验证,如果选择count(*)&gt; 3你不会接受新的插页。
因为如果要在数据层中执行此操作,则必须使用存储过程,因为首先需要识别具有3个以上寄存器的所有寄存器,并仅删除最后一个寄存器。 Saludos
答案 3 :(得分:0)
由于MySQL在更新查询表时非常困难(例如参见Dems的答案),我能想到的最好的不仅仅是一个语句,而且在正面看起来相当可读;
CREATE TEMPORARY TABLE Dump AS SELECT id FROM table1 WHERE id NOT IN
(SELECT MIN(id) FROM table1 GROUP BY city,item UNION
SELECT MAX(id) FROM table1 GROUP BY city,item);
DELETE FROM table1 where id in (select * from Dump);
DROP TABLE DUMP;
不确定删除哪个副本是否重要,这会保留第一个和最后一个。
答案 4 :(得分:0)
在回答Joachim的回答时,你会问到保存3行或5行,这是实现它的一种方法。根据您使用此数据库的方式,您可以在循环中调用它,也可以将其转换为存储过程。无论哪种方式,您都将继续运行整个代码块,直到Rows Affected = 0:
drop table if exists TempTable;
create table TempTable
select city, item,
count(*) as record_count,
min(id) as ItemToDrop -- this could be changed to max() if you
-- want to delete new stuff instead
from YourTable
group by city, item
having count(*) > 2; -- This value = number of rows you save
delete from YourTable
where id in (select ItemToDrop from TempTable);