MySQL根据条件将行从一个表移动到另一个表

MySQL根据条件将行从一个表移动到另一个表,mysql,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', PRIMAR

我们有一个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;
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;
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;
这是一张用于购买物品的表格。约600万份参赛作品

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;
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;
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;
这是一个用户表,大约1700万个条目

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

有没有关于如何以最少的停机时间实现这一目标的建议

@Yumoji,我想你的问题是如何计算任何活动的最后三年。对吧?

因此,如果是这种情况,那么您应该在DB表中添加一个“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';
我希望它能解决这个问题。干杯