【发布时间】:2012-03-26 14:28:20
【问题描述】:
我目前正在尝试创建一个 sqlite 数据库,我可以在其中从另一个 sqlite 数据库(无法附加)导入一个表,并向每列添加一些额外的数据。
由于没有INSERT OR UPDATE 我想出了这个:
我正在考虑将数据拆分为两个表,然后将它们连接起来,这样我就可以将整个导入转储到一个表中,替换所有更改并单独管理额外数据,因为导入时不会更改。
第一个表(我们称之为base_data)看起来像
local_id | remote_id | base_data1 | base_data2 | ...
---------+-----------+------------+------------+----
除了local_id 之外,一切都只是远程数据库的镜像(我可能会添加一个同步时间戳,但现在没关系)。
第二个表看起来很相似,但将remote_id 设置为外键
remote_id | extra_data1 | extra_data2 | ...
----------+-------------+-------------+----
CREATE TABLE extra_data (
remote_id INTEGER
REFERENCES base_data(remote_id)
ON DELETE CASCADE ON UPDATE CASCADE
DEFERRABLE INITIALLY DEFERRED,
extra_data1 TEXT,
extra_data2 TEXT,
/* etc */
)
现在我的想法是简单地使用 INSERT OR REPLACE INTO base_data ... 值,因为我从中导入的数据库没有同步时间戳或其他任何内容,我必须比较所有内容以找出我必须到 UPDATE 的行/到 INSERT 的行。
但问题就在这里:INSERT OR REPLACE 实际上是一个DELETE,后跟一个INSERT,删除部分会触发外键ON DELETE,我认为我可以通过设置约束DEFERRED 来防止这种情况。如果我将INSERT OR REPLACE 包装在事务中,它也不起作用。尽管语句后存在相同的外键,但它总是删除我的额外数据。
是否可以停止ON DELETE 触发直到INSERT OR REPLACE 完成?也许是一些特殊的交易模式/pragma?
【问题讨论】:
标签: sqlite