MySQL通过条件将行从一个表移动到另一个表

时间:2017-10-31 06:46:37

标签: mysql

我们拥有一个用户及其销售和购买产品的MySQL数据库。我们需要移动过去3年未登录且从未在我们网站上购买或出售任何内容的非活动用户到另一个桌面。每个表都有数百万条目。

这是已售商品的表格。大约4000万条目;

CREATE TABLE `sold` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `uid` int(10) unsigned NOT NULL,
  `item` bigint(20) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `uid` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是购买物品的表格。大约600万条目;

CREATE TABLE `purchased` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `uid` int(10) unsigned NOT NULL,
  `item` bigint(20) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `uid` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是一个用户表,大约17米的条目;

CREATE TABLE `users` (
  `uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT '',
  `email` varchar(64) DEFAULT NULL,
  `lastlogin` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`uid`),
  UNIQUE KEY `email_index` (`email`),
  KEY `lastlogin` (`lastlogin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是我们需要将非活动用户移至

的表格
CREATE TABLE `inactiveusers` (
  `uid` int(10) unsigned NOT NULL,
  `name` varchar(32) DEFAULT '',
  `email` varchar(64) DEFAULT NULL,
  `lastlogin` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`uid`),
  UNIQUE KEY `email_index` (`email`),
  KEY `lastlogin` (`lastlogin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

有关如何以最短的停机时间实现此目的的任何建议?

1 个答案:

答案 0 :(得分:0)

@Yumoji,我想你的问题是如何计算任何活动的最后3年3年。正确?

所以,如果是这种情况,那么你应该添加一个" created_at"数据库表中的列。

现在,在表格中添加created_at列后,您可以轻松计算过去三年的活动。 这是 -

SELECT uid FROM sold AND purchased WHERE sold.created_at>DATE_SUB(NOW(), INTERVAL 3 YEAR) OR purchased.created_at>DATE_SUB(NOW(), INTERVAL 3 YEAR);

从此查询中获取用户ID,然后 -

INSERT INTO inactiveusers select * from users where uid = 'the user ids u get';
DELETE FROM users where uid = 'the user ids u get';

我希望它能解决问题。欢呼声。