MySQL通过id从多个表过滤器插入表中

时间:2016-05-06 13:44:36

标签: mysql

我尝试从多个表中插入表格。

这是我的表

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: 另一个问题是,当我运行此查询时,我的磁盘几乎已满:(

1 个答案:

答案 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