sqlite – INSERT OR REPLACE外键ON DELETE CASCADE工作得太好了
我目前正在尝试创建一个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:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |