将数据添加到相互关联的表中......更方便吗?

时间:2011-03-22 18:11:23

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

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

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

现在这里变得棘手......我正在进入:

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

我收到一个错误:说明细节上的IDcode没有默认值..所以我添加一个然后抱怨Field'Master_IDcode'没有默认值

这一切都有道理,但我想知道是否有任何简单的方法来做我想做的事情。我想将数据添加到细节中,如果不存在IDcode,我想在主表中添加一个条目。问题是我必须首先将名称添加到基金Master..wait中以获取要生成的唯一ID(对于IDcode)然后计算出来并在我输入主数据时将其添加到我的查询中。你可以想象,由于我有很多表,因此查询可能会持续很长时间。

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

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

P.S。这可能是一个不同的问题,但我听说过Django for python,它有助于创建查询......它会帮助我的情况吗?

提前非常感谢: - )

2 个答案:

答案 0 :(得分:1)

我认为没有一步到位的方法。

我所做的是发布

INSERT IGNORE (..) values (..)

到主表,如果它不存在,将创建该行,或者什么也不做,然后发出

SELECT id FROM master where someUniqueAttribute = ..

另一个选项是存储过程/触发器,但它们在MySQL中仍然很新,我怀疑这有助于提高性能。

答案 1 :(得分:1)

(决定扩展上述评论并将其写入答案)

我建议在数据库中创建一组临时表(每个数据集/文件一个)。

然后使用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检查数据,而不是在yuor编辑器中浏览csv文件。