我正在尝试将数据从CSV文件导入数据库,但是表A有外键约束表B.我想要的是将数据插入A并在外键匹配时更新B中的相关行B中的主键(并且没有其他问题);否则什么都不会发生。目前,我正在做(稍微复杂一点的)以下内容:
PRAGMA foreign_keys = ON;
for (row in b.csv){
INSERT INTO b
VALUES ("b_key", NULL, NULL);
}
for (row in a.csv){
INSERT OR IGNORE INTO a
VALUES ("a_key", "b_key", ...);
UPDATE OR IGNORE b
SET x = "X", y = "Y"
WHERE key = "b_key";
}
结果是a.csv最终将包含一个行,其中“b_key”不在表b中,此时整个批量更新将失败,异常“外键约束失败”。任何人都知道一种简单(甚至不简单)的方式,我可以让它工作吗?
答案 0 :(得分:0)
1)在第二个循环中切换INSERT
UPDATE
的顺序。这样,“b”将在“a”需要之前设置。
2)使用INSERT OR REPLACE
而不是UPDATE
作为“b”键。更多关于它是如何工作的以及它擅长的原因:SQLite - UPSERT *not* INSERT or REPLACE。基本上,在将任何内容放入“a”表之前,您将保证在“b”中键入密钥。