我对 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/