主数据库中的外键引用附加数据库

fin*_*nnw 6 sqlite foreign-keys

在SQLite3中,有什么方法可以在主数据库中具有引用附加数据库中列的外键(反之亦然?)

我希望在多个进程之间共享附加的(只读)数据库,每个进程都有自己的(读/写)主数据库。

我这样创建父表(在数据库“ ParentDB”中):

create table Parent (id integer primary key);
Run Code Online (Sandbox Code Playgroud)

现在,我在主数据库中尝试此操作:

attach 'parent.sqlite3' as ParentDB;
create table Child (id integer not null references Parent (id),
                    constraint PK_Child primary key (id));
insert into ParentDB.Parent (id) values (42);
Run Code Online (Sandbox Code Playgroud)

当我尝试它时,它将创建没有错误的外键。现在,我尝试在子表中插入一行:

insert into Child (id) values (42);
Run Code Online (Sandbox Code Playgroud)

我得到这个错误:

Error: no such table: main.Parent
Run Code Online (Sandbox Code Playgroud)

因此,似乎总是假定父表和子表属于同一数据库。

同样,外键语法也不允许您指定父表所属的数据库

有解决方法吗?


这个问题是相关的,但是这里的父表和子表都在同一个附加数据库中,而我却在单独的数据库中。

CL.*_*CL. 5

SQLite的内置外键约束不适用于整个数据库。

唯一的解决方法是手动编写检查约束和执行相同检查的触发器。

  • 根据 SQLite 文档,触发器只能作用于与更改的表位于同一数据库中的表。请参阅此处标题为“触发器内的 UPDATE、DELETE 和 INSERT 语句的语法限制”部分:https://www.sqlite.org/lang_createtrigger.html (2认同)