查询:
update cities c
inner join regions r on (c.region = r.region_id and c.code = r.country_code)
set c.region_id = r.id;
城市中有300万条记录,因此MySQL服务器在执行期间失败。
有限制使用它的方法吗?每10万条记录?
或执行该查询的任何其他方式?
城市表架构
CREATE TABLE `cities` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(3) NOT NULL,
`city` varchar(30) NOT NULL,
`native_city` varchar(30) DEFAULT NULL,
`region` int(11) DEFAULT NULL,
`population` int(11) DEFAULT NULL,
`lat` decimal(9,7) DEFAULT NULL,
`lon` decimal(9,7) DEFAULT NULL,
`country_id` int(11) NOT NULL,
`region_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3173959 DEFAULT CHARSET=utf8
country_id
,region_id
不是外键。只是空字段,我想用其他表中的值填充,然后我添加fk
。
答案 0 :(得分:1)
对于多表语法,UPDATE更新每个名为的表中的行 在table_references中满足条件。每个匹配的行是 更新一次,即使它多次符合条件。对于 多表语法,ORDER BY和LIMIT不能使用。
但是您可以将ORDER BY和LIMIT隐藏到子查询中,然后将其与原始表一起加入以进行更新。这是一个例子:
update cities c
inner join
(select c1.id,r.id as r_id from cities c1
inner join regions r on (c1.region = r.region_id
and c1.code = r.country_code)
order by c1.id
LIMIT 1000
) c2 on c.id=c2.id
set c.region_id = c2.r_id