从SQLite数据库中删除重复的帐户名称(意外区分大小写创建了一些重复项)

时间:2013-12-02 21:58:36

标签: sql database sqlite duplicates

我已经四处寻找这个问题但是找不到一个好的答案。

我运行开发多人游戏服务器mod并且我首先在帐户数据库中犯了一个大错:区分大小写,所以如果加入了名为'bob'和'Bob'的玩家已经在数据库中,那么一个新帐户已注册(这导致了问题!)数据库上也没有'PRIMARY KEY'列。

所以现在我的数据库中有很多'bob','Bob','BOB'等重复,并且想知道是否有一种很好的方法可以清理数据库并删除这些副本。

我能想到的唯一方法是在数据库上运行一个循环,将每个名称存储在内存中(12k记录),然后再次运行它并将名称标记为“found”,然后删除已标记为“found”的记录”

无论如何,提前感谢任何帮助:)

3 个答案:

答案 0 :(得分:0)

将结果插入另一个表中,然后就不会有重复

SELECT DISTINCT UPPER(name) FROM table

答案 1 :(得分:0)

这是使用简单的delete语句在sqlite中执行此操作的方法:

delete from test where rowid in
( select test.rowid from test
  inner join (select upper(name) name, min(rowid) rowid from test group by upper(name)) t
  on upper(test.name) = t.name and test.rowid <> t.rowid);

SQLFiddle

答案 2 :(得分:0)

我会将所有数据复制到新表中,忽略重复:

ALTER TABLE players RENAME TO players_old;
CREATE TABLE players (name TEXT UNIQUE NOT NULL COLLATE NOCASE, ...);
INSERT OR IGNORE INTO players SELECT * FROM players_old;

通过这种方式,您将获得一个具有唯一名称的新表和一个包含先前数据的旧表。