SQLITE:插入或替换到主机表后,引用列的值未在从属表中更新

问题描述 投票:0回答:1

我有两个 SQLite 表:

  1. 其中一个有一个用作主键的主ID和一个辅助ID,该ID可能为空(即未知),但如果不为空,则它在表中必须是唯一的。
  2. 另一个表有自己的主 ID,但也引用第一个表中的主 ID 和辅助 ID。

我想要的:如果第一个表中的某些行最初将辅助 id 设置为 null 但随后更新为非空值,则第二个表中的相应行需要“拾取”第一个表中引用的更新值。

这是最小的可重现示例:

$ sqlite3
SQLite version 3.37.2 2022-01-06 13:25:41
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> pragma foreign_keys = on;
sqlite> create table a (
   ...> primaryId TEXT PRIMARY KEY NOT NULL UNIQUE,
   ...> secondaryId TEXT DEFAULT NULL UNIQUE,
   ...> UNIQUE(primaryId, secondaryId));
sqlite> create table b (
   ...> id TEXT PRIMARY KEY NOT NULL UNIQUE,
   ...> parentPrimaryId REFERENCES a(primaryId) ON UPDATE CASCADE,
   ...> parentSecondaryId REFERENCES a(secondaryId) ON UPDATE CASCADE);
sqlite> INSERT INTO a(primaryId) VALUES("a_primary_id");
sqlite> INSERT INTO b(id, parentPrimaryId) VALUES("b_id", "a_primary_id");
sqlite> SELECT * FROM a;
a_primary_id|
sqlite> SELECT * FROM b;
b_id|a_primary_id|
sqlite> INSERT OR REPLACE INTO a(primaryId, secondaryId) VALUES("a_primary_id", "a_secondary_id");
sqlite> SELECT * FROM a;
a_primary_id|a_secondary_id
sqlite> SELECT * FROM b;
b_id|a_primary_id|
sqlite> 

我希望最后一个查询从

b
中选择值,为
a_secondary_id
列显示
parentSecondaryId
。我可以使用 SQLite 实现这样的行为吗? 我尝试对表
FOREIGN KEY(parentPrimaryId, parentSecondaryId) REFERENCES a(primaryId, secondaryId)
列使用
REFERENCES
而不是
b
,但结果仍然相同。

sqlite foreign-keys
1个回答
0
投票

找到了一种使用触发器实现我想要的行为的方法:

sqlite> create trigger update_parent_secondary_id after insert on a
   ...> begin
   ...> UPDATE b SET parentSecondaryId = new.secondaryId WHERE b.parentPrimaryId = new.primaryId;
   ...> end;

但不确定这是否是最佳解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.