我知道很多人之前都问过这个问题,但我没有找到一个绝对的答案,我看到了很多不同的答案,所以我很困惑。
我在我的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
这意味着我希望数据库(在本例中)最终成为
user: zeus
code: olympus
email: k@domain.com
user: usa
code:1233333
email: usa@domain.com
最后,我想确保数据库中没有重复的行/数据。我不想留下一行带有重复的用户名,因为“代码”实际上是每个登录会话生成的唯一代码并破坏以前的代码,我不知道哪个代码是最新的代码,因为我没有使用任何带有date()函数的“创建”行。
现在我使用以下代码:
"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选项,那么想要注册的新用户会发生什么?他们的数据不在数据库中,所以没有什么可以更新,所以新用户会出错,对吗?
非常感谢!
答案 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;