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

时间:2015-02-22 02:49:38

标签: php mysql database insert-update on-duplicate-key

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

我在我的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行或更多行,则包含该用户名的所有行都将被删除。
  2. 这意味着我希望数据库(在本例中)最终成为

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

    最后,我想确保数据库中没有重复的行/数据。我不想留下一行带有重复的用户名,因为“代码”实际上是每个登录会话生成的唯一代码并破坏以前的代码,我不知道哪个代码是最新的代码,因为我没有使用任何带有date()函数的“创建”行。


    1. 我想确保将来不需要清理更多重复的行,所以我想确保每次登录/注册到我的站点时,系统都会检查用户名是否已经在数据库中。 如果确实如此..只有他的“代码”行会受到影响,新代码[将通过登录生成]将替换包含用户名的同一行中的旧代码。 如果用户名不在数据库中,系统会将所有详细信息插入一行。这意味着:用户,代码和电子邮件。 下次他将登录时,系统将仅更新当前行中的代码行,并且不会添加具有相同用户和行的新行。带有新代码的同一封电子邮件。
    2. 现在我使用以下代码:

      "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'";  
      

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

      非常感谢!

1 个答案:

答案 0 :(得分:0)

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

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;