sqlite – INSERT OR REPLACE外键ON DELETE CASCADE工作得太好了

sqlite – INSERT OR REPLACE外键ON DELETE CASCADE工作得太好了,第1张

概述我目前正在尝试创建一个sqlite数据库,我可以从另一个sqlite数据库导入一个表(无法附加),并为每一列添加一些额外的数据. 由于没有INSERT或UPDATE我想出了这个: 我正在考虑将数据拆分为两个表并在之后加入它们,因此我可以将整个导入转储到一个表中,替换所有更改的内容并分别管理额外数据,因为导入时不会更改. 第一个表(我们称之为base_data)看起来像 local_id | rem 我目前正在尝试创建一个sqlite数据库,我可以从另一个sqlite数据库导入一个表(无法附加),并为每一列添加一些额外的数据.

由于没有INSERT或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 …值,因为我导入的数据库没有同步时间戳或任何东西,我将不得不比较所有内容以找出我要更新/要插入什么行.

但问题在于:INSERT OR REPLACE实际上是一个DELETE后跟一个INSERT,删除部分触发外键ON DELETE我认为可以通过制定约束DEFERRED来防止.如果我在事务中包装INSERT OR REPLACE也不起作用.虽然声明后存在相同的外键,但它总是删除我的额外数据.

是否可以在INSERT OR REPLACE完成之前停止ON DELETE?也许一些特殊的交易模式/ pragma?

如果我用触发器替换ON DELETE CASCADE部件似乎有效:
CREATE TRIGGER on_delete_trigger   AFTER DELETE ON base_data   BEGIN       DELETE FROM extra_data WHERE extra_data.remote_ID=olD.remote_ID;   END;

该触发器仅由DELETE语句触发,到目前为止应解决我的问题.

(问题中OP提供的答案)

其他信息由jmathew引用documentation:

When the REPLACE conflict resolution strategy deletes rows in order to satisfy a constraint,delete triggers fire if and only if recursive triggers are enabled.

总结

以上是内存溢出为你收集整理的sqlite – INSERT OR REPLACE外键ON DELETE CASCADE工作得太好了全部内容,希望文章能够帮你解决sqlite – INSERT OR REPLACE外键ON DELETE CASCADE工作得太好了所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1161300.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存