先添加Table1的项,这样添加Table2的项时,数据库中已经有Table1的对应记录了。对于更多表格,您将弄清楚顺序。如果您正在创建一个任意数据库模式的系统,您将需要在内存中创建一个表图(其中每个节点是一个表,每个弧是一个外键)[基础库中没有该类型的类型],然后将其转换为树,以便您通过遍历树(广度优先)获得正确的顺序。
您可以让数据库处理违反外键的情况,因为没有这样的字段。您必须决定是对整个导入操作还是按项目进行交易。
尽管可以事先分析 CSV。为此,您需要存储每个表的主键的值 [为此使用一个集合](同样,以正确的顺序遍历表),然后当您读取具有外部表的表时您已经阅读过的表的键,您可以检查键是否存在,它还可以帮助您检测任何可能的重复项。[如果您已经在数据库中考虑了一些事情,那么您也必须进行查询......但是,请注意数据库是否处于活动系统中,在您仍在决定是否可以添加记录时,记录可能会被删除CSV 没有问题]。
为了解决您在添加时生成新 ID...
我能想到的最简单的解决方案是:不要。特别是如果它是一个正在处理其他请求的活动系统,因为这样就无法事先预测新的 ID。最好的办法是一个一个地添加它们,在这种情况下,您将不得不相应地考虑您的交易策略......可能是您无法回滚的情况。
虽然,我认为您的问题更深一些:如果 Table1 的 ID 确实发生了变化,那么如何更新 Table2 中的相应记录,使其指向 Table1 中的正确记录?
为此,我想建议按照上面描述的方式进行分析,然后您将拥有一组可用作索引的集合。这将帮助您在 Table2 中为 Table1 中的每个 ID 找到需要更新的记录。[如果您已经更新了一条记录,跟踪也很重要,不要重复两次,因为生成的 ID 可能会与尚未发送到数据库的 ID 匹配]。
要回滚,您还可以使用这些集合,因为它们最终将具有新的 ID,用于标识如果您想中止操作必须从数据库中提取的记录。
编辑:那些集合(我推荐 hashset)只有故事,因为它们只有主键(例如:表 1 中的 ID)。您将需要袋子来保存外键(在本例中为 Table2 中的 Table1_ID)。