我对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,它有助于创建查询......它会帮助我的情况吗?
提前非常感谢: - )
答案 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文件。