我尝试从多个表中插入表格。
这是我的表
provinces table :
id , name
regencies table :
id , province_id , name
districts table :
id , regency_id , name
villages table :
id , district_id , name
我想插入具有此结构的表:
tb_all
id , id_villages , villages_name ,
id_districts , districts_name ,
id_regency , regency_name ,
id_provinces , provinces_name
我真的是关于mysql命令的新手。
这是我的疑问:
INSERT INTO tb_all (
id_villages,
villages_name,
id_districts,
districts_name,
id_regency,
regency_name,
id_provinces,
provinces_name)
SELECT v.id,
v.name,
d.id,
d.name,
r.id,
r.name,
p.id,
p.name
FROM villages AS v,
districts AS d,
regencies AS r,
provinces AS p
WHERE p.id = '73'
但我收到了这个错误:
**Error : Lock wait timeout exceeded**
我很感激任何答案。 THX。
编辑2: 另一个问题是,当我运行此查询时,我的磁盘几乎已满:(
答案 0 :(得分:1)
您应该加入将外键与主键链接的表,否则您将生成Cartesian product,这将不是您想要的,并且可能会使您的数据库引擎运行到其极限。
正如您在评论中所写,您确实将村庄记录过滤为18,000条记录。但是你没有过滤所有其他表,其中 regencies 可能有超过5,000条记录,区 200,省可能50所以你得到乘法作为结果集:18,000 x 5,000 x 200 x 50 = 9000亿条记录!
以下是建议的查询。我建议你先运行以SELECT
开头的部分,看看是否产生了正确的记录。然后,如果没有问题,请运行INSERT
:
INSERT INTO tb_all (
id_villages,
villages_name,
id_districts,
districts_name,
id_regency,
regency_name,
id_provinces,
provinces_name)
SELECT v.id,
v.name,
d.id,
d.name,
r.id,
r.name,
p.id,
p.name
FROM provinces AS p
INNER JOIN regencies AS r
ON r.province_id = p.id
INNER JOIN districts AS d
ON d.regency_id = r.id
INNER JOIN villages AS v
ON v.district_id = d.id
WHERE p.id = 73