MySQL从多个表中插入一个表并按id过滤

标签 mysql

我尝试从多个表插入到一个表中。

这是我的 table

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

我很感谢您的回答。谢谢。

编辑2: 另一个问题是当我运行此查询时,我的磁盘几乎已满:(

最佳答案

您应该连接将外键链接到主键的表,否则您将生成 Cartesian product ,这不会是您想要的,并且可能会使您的数据库引擎运行到极限。

正如您在评论中所写,您确实将村庄记录过滤为 18,000 条记录。但您不会过滤所有其他表,其中地区可能有超过 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

关于MySQL从多个表中插入一个表并按id过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37074005/

相关文章:

mysql - 如何将内置时间浏览器过滤器反射(reflect)到 Grafana 中的 mysql 查询中?

mysql - 使用二进制 blob 恢复 MySQL 转储

php - 带有 LIKE、通配符和前导零的 MySQL SELECT

php - 通过 PHP 使用和过滤数据

mysql - MySQL 上传数据库列时出现多个错误

mysql - 尝试创建复杂 SQL 查询的新手 SQL 用户

php - 对 Mysql PHP 查询结果进行分组

php - 获取.dat文件内容php

php - strl 缩短字符

java - 从 Java 到 MySQL 的 Twitter 文本 : utf8mb4 SQL Error "reportcharsetnr("