mysql - 将数据添加到相互关联的表..更简单的方法?

标签 mysql django foreign-keys foreign-key-relationship

我对 mysql 有点生疏,并试图再次跳入。如果这个问题太简单了,我很抱歉。

我基本上创建了一个数据模型,它有一个名为“Master”的表,其中包含名称和 IDcode 的必填字段,然后是一个带有外键 IDcode 的“Details”表。

现在这就是它变得棘手的地方..我正在输入:

INSERT INTO Details (Name, UpdateDate) Values (name, updateDate)

我得到一个错误:说 IDcode on details 没有默认值..所以我添加一个然后它提示 Field 'Master_IDcode' 没有默认值

这一切都很有道理,但我想知道是否有任何简单的方法来完成我想做的事情。我想将数据添加到详细信息中,如果不存在 IDcode,我想在主表中添加一个条目。问题是我必须首先将名称添加到基金Master..等待生成唯一ID(用于IDcode),然后在输入主数据时找出并添加到我的查询中。您可以想象,由于我有很多表,查询可能会变得很长。

有没有更简单的方法?每次我添加一些东西时,如果外键存在,它会按名称搜索,如果不存在,它会将它添加到它链接到的所有表上?人们这样做有标准的方法吗?我无法想象面对如此多的复杂数据库,人们还没有想出更简单的方法。

抱歉,如果这个问题没有意义。如果需要,我可以添加更多信息。

附注这可能是一个不同的问题,但我听说过 Django for python 并且它有助于创建查询..它对我的情况有帮助吗?

提前致谢:-)

最佳答案

(决定扩展上面的评论并将其放入答案中)

我建议在您的数据库中创建一组暂存表(每个数据集/文件一个)。

然后使用 LOAD DATA INFILE(或批量插入行)到这些暂存表中。 确保在加载之前删除索引,并在加载数据后重新创建所需内容。

然后您可以单次遍历暂存表以创建缺失的主记录。例如,假设您的一个暂存表包含一个应该用作 masterID 的国家/地区代码。您可以按照以下方式添加主记录:

insert 
  into master_table(country_code)
select distinct s.country_code 
  from staging_table     s
  left join master_table m on(s.country_code = m.country_code)
 where m.country_code is null;

然后您可以继续将行插入到“真实”表中,知道所有详细信息行都引用有效的主记录。

如果您需要获取引用信息和数据(例如翻译一些代码),您可以通过简单的连接来实现。此外,如果您想按其他表过滤行,这现在也非常容易。

insert 
  into real_table_x(
          key
         ,colA
         ,colB
         ,colC
         ,computed_column_not_present_in_staging_table
        ,understandableCode
       )
  select x.key
        ,x.colA
        ,x.colB
        ,x.colC
        ,(x.colA + x.colB) / x.colC
        ,c.understandableCode
     from staging_table_x  x 
     join code_translation c on(x.strange_code = c.strange_code);

这种方法非常有效,而且扩展性非常好。以上的变体通常用于数据仓库的 ETL 部分以加载大量数据。

MySQL 的一个警告是它不支持散列连接,这是一种非常适合完全连接两个表的连接机制。 MySQL 使用嵌套循环,这意味着您需要非常仔细地为连接列建立索引。 在主键上具有集群功能的 InnoDB 表有助于提高效率。

最后一点。当数据库中有暂存数据时,很容易添加一些数据分析并将“坏”行放在单独的表中。然后,您可以使用 SQL 检查数据,而不是在您的编辑器中费力地浏览 csv 文件。

关于mysql - 将数据添加到相互关联的表..更简单的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5395861/

相关文章:

php - 为什么无法使用php更新数据库表中的数据?

python - 覆盖 get_object() 并手动设置 PK

sql - Django中的双外键?

mysql - java jdbc插入外键时主键的重复条目

php - 使用外键合并两个数据库时的 SQL 问题

mysql - 使用子查询的返回结果对 SQL 查询进行排序

mysql - 选择 1 到多的更好方法?

mySQL检索按顺序重复一个值的记录

python - 如何动态地将 Docker 容器的 IP 添加到 Django ALLOWED_HOSTS

python - 修改生成的查询以运行 LIKE 子句 - 红色查询生成器