2010-06-07 119 views
0

我想解决一个问题,我继承了对不同数据源的不良处理。我有一个包含善恶用户的用户表。INSERT..ON DUPLICATE KEY UPDATE - 但不使用重复密钥来比较

create table `users`( 
    `user_id` int(13) NOT NULL AUTO_INCREMENT , 
    `email` varchar(255) , 
    `name` varchar(255) , 
    PRIMARY KEY (`user_id`) 
); 

在此表中,主键当前设置为user_id。

我有另一个表('users_evil'),其中只包含恶意用户(该表中的所有用户都包含在第一个表中) - 此表上的user_id与第一个表中的user_id不一致。

我想让我的所有用户都在一张桌子上,并简单地标记哪些是好的,哪些是坏的。

我想要做的是改变用户表并添加一个默认为0的列('evil')然后我想从我的'users_evil'表中转储数据,然后运行INSERT..ON将这些数据复制密钥更新放入第一个表(设置'evil'= 1,其中电子邮件匹配)

问题在于'PK'设置为user_id而不是'email'。 任何建议,或甚至成功实现这一目标的另一种策略。

我可以运行这个语句,但是在语句持续时间内将另一列作为PK来处理。

回答

2
ALTER table add column... 

UPDATE users set evil = 0; 

UPDATE users u join users_evil ue ON ue.email = u.email and u.name = ue.name set evil = 1;  

你只需要在用户表

+0

我不知道你可以在更新期间加入 - 这正是我发布到SO的原因。感谢这个答案。 – calumbrodie 2010-06-07 16:10:37

+0

当你只运行一次这样简单的查询时,我没有看到有临时索引的一点。 – 2010-06-07 16:13:06

+0

确实。你的方法更有意义。标记为正确,感谢您的帮助 – calumbrodie 2010-06-07 16:16:16

2

你看这个:

update users set evil=1 where email in (select email from users_evil); 
+0

这应该工作,但它似乎导致我的服务器崩溃并燃烧。我注意到你不能在mysql中进行EXPLAIN更新?我的数据集不是很大(大约20k行)。谢谢 – calumbrodie 2010-06-07 16:15:02

0

你可以执行外连接表的更新不良用户,然后检测其中一个用户是邪恶通过寻找非NULL值:

UPDATE (users LEFT OUTER JOIN evil_users ON users.email = evil_users.email) 
    SET users.evil=1 
    WHERE evil_users.some_field IS NOT NULL; 
+1

其实,现在我想到了,外连接甚至不需要。查看Imre L对没有外连接的版本的回答。 – VeeArr 2010-06-07 16:09:38

+0

感谢您的回答 – calumbrodie 2010-06-07 16:16:41

相关问题