从我的数据库中删除重复的行 + 确保不再添加重复项

Delete duplicated rows from my database + Make sure no more duplications will be added

我知道很多人以前问过这个问题,但我没有找到绝对的答案,我看到了很多不同的答案,所以我很困惑。

例如,我的 sql 数据库中有以下数据:

user: test
code: blablah
email: test@domain.com

user: zeus
code: olympus
email: k@domain.com

user:test
code:123132
email: test@domain.com

user:test
code:987654331
email: test@domain.com

 user: usa
    code:1233333
    email: usa@domain.com
  1. 我想删除包含相同用户名的所有行。我想要 运行 一个查询,该查询将检查每个用户名是否有多于一行。 如果某个用户名有 2 行或更多行,则包含该用户名的所有行都将被删除。

这意味着我希望数据库,在这个例子中,在最后

   user: zeus
    code: olympus
    email: k@domain.com

     user: usa
        code:1233333
        email: usa@domain.com

最后,我想确保我的数据库中没有重复的行/数据。我什至不想留下重复用户名的一行,因为 "code" 实际上是一个唯一的代码,它在每次登录会话时都会生成并破坏以前的代码,而且我不知道哪个代码是最新的一个是因为我没有使用任何带有 date() 函数的 "created" 行。


  1. 我想确保以后不需要清理更多重复的行,所以我想确保每次 login/register 到我的网站时,系统都会 运行 检查用户名是否已在数据库中。 如果是这样.. 只有他的 "code" 行会受到影响,新代码 [将在登录时生成] 将替换包含用户名的同一行中的旧代码。 如果用户名不在数据库中,系统会将他的所有详细信息插入一行。这意味着:用户、代码和电子邮件。 下次他登录时,系统将只更新当前行中他的代码行,而不会添加具有新代码的同一用户和同一电子邮件的新行。

现在我使用以下代码:

"INSERT INTO logs (user, code, email) VALUES('$user', '$code', '$email')";  

我正在考虑将其更改为

INSERT INTO logs(user, code, email)VALUES($user,$code,$email)ON DUPLICATE KEY UPDATE    $code=VALUES(code)  

为了达到我的目的。为此,我需要将数据库中的 "user" 行更改为唯一的行。

有人建议我使用以下代码:

 "UPDATE `logs` SET `code` = '$code' WHERE `user` = '$user' AND `email` =  '$email'";  

但我认为这不是正确的方法,因为如果我只使用更新选项,那么想要注册的新用户会怎样?他们的数据不在数据库中,所以还没有什么可以更新的,所以新用户会出错,对吧?

非常感谢!

对于第一个问题,您可以使用此查询:

delete from logs where user IN 
(SELECT * from (select user FROM logs GROUP BY user HAVING COUNT(user) > 1) tempTable);

对于第二个问题,因为您已经有了主键,所以不能在 user 列上使用重复键更新。但是您可以先在 Update 上背靠背使用两个查询,然后在 insert 上使用两个查询:

    //this Update query is executed if the user is already there. If the user is not there this query will fail and php will go to next query
    $query1 = update logs set code = $code where user = $user;

   //This query will insert the data only if `user` is not found

    $query2 = insert into logs ($user,$code,$email)
    select user,code,email
    from logs
    where not exists (select * from user where user = $user)
    limit 1;