我有两个 SQLite 表:
我想要的:如果第一个表中的某些行最初将辅助 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> create trigger update_parent_secondary_id after insert on a
...> begin
...> UPDATE b SET parentSecondaryId = new.secondaryId WHERE b.parentPrimaryId = new.primaryId;
...> end;
但不确定这是否是最佳解决方案。