MySQL批量更新,已注册,未注册用户的更新标志

时间:2019-01-14 09:16:43

标签: php mysql innodb

我当前的表已注册了用户a,b,c,d,e,f。

然后我获得所有注册用户的完整列表,其中列出了c,d,e,f,g h。

这意味着a,b尚未注册,而g,h是新的注册用户。

注意*:没有事件告诉我用户何时注册或注销。我不想每天访问一次以上的所有注册用户的列表。

我当前更新MySQL的方法:

  const PrivateRoute = (props) => {
  const { component: Component, isLogged, ...rest } = props;
  console.log('on est dans la route lol', isLogged, {...rest});

  return (
    <Route
  {...rest}
  render={propsRender =>
    isLogged ? (
      <Component {...propsRender} />
    ) : (
      <Redirect
        to={{
          pathname: "/login",
          state: { from: propsRender.location }
        }}
      />
    )
  }
/>
);
};


PrivateRoute.propTypes = {
  isLogged: PropTypes.bool,
};

export default PrivateRoute;

然后,我使用所有注册用户的新列表继续更新表:

UPDATE users SET registered = -1 WHERE registered = 1;

然后,我继续更新表,标记未注册的用户:

INSERT INTO users (id, registered) VALUES($userid[i], 1) ON DUPLICATE KEY UPDATE registered = 1;

基本上使用-1作为指示用户已注册的指示器,但根据完整列表,该标志不再存在;

这在一张小桌子上可以正常工作,但要花费数小时才能花费数万。

有更好的方法吗?

将其减少到几分钟是可以接受的。

2 个答案:

答案 0 :(得分:1)

您可以像这样使用where in

UPDATE users set registered = 1 WHERE id in (implode($userid,','))

您将用户ID内爆

sql语句应如下所示

UPDATE users set registered = 1 WHERE id in (1,2,3,5)

编辑:这是mysql批处理插入的链接 How to do a batch insert in MySQL

答案 1 :(得分:1)

秘密在于扔掉令人讨厌的UPDATE

registered列设为某种DATETIME,而不是标记。

现在测试在WHERE ts < NOW() - INTERVAL 1 DAY上进行了-无需每天更改registered

对其中一项进行操作时,只需使用UPDATE ... ts = NOW() WHERE id = ...对其进行更新。