Skip to main content
 首页 » 编程设计

python之在 sqlite3 中引用(外键)表的一列通过连接其他两个表中的两列

2025年05月04日14lori

我在 python 中使用 sqlite3。我有两个表,每个表中都有 id 列。表中的这些 id 列可以有不同的值。我想创建一个包含列 id 的新表,它可以通过组合前两个表的 id 列中的值来仅包含值。我能够使用表中的任何一个成功创建外键(链接),但不能同时使用两者。我还尝试从两个表创建连接 View ,并尝试将第三个表与连接连接起来,但没有成功。

请您参考如下方法:

您可以使用触发器在来自两个不同表的列的并集上创建等效的外键。您需要为受限表的插入和更新以及引用表的更新和删除创建触发器。如果我没有遗漏任何东西,您总共需要六个触发器。

请参阅此链接,其中作者几乎告诉您如何执行此操作,因为它是在 sqlite 开始强制执行外键之前编写的:

http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers

例如,这将是约束表的 INSERT 触发器,其中约束表是 foo , 引用表为 bar1和 bar2`:

pragma foreign_keys=on; 
 
create table bar1 (id integer primary key); 
create table bar2 (id integer primary key); 
 
insert into bar1 values (1); 
insert into bar1 values (2); 
insert into bar2 values (2); 
insert into bar2 values (3); 
 
create table foo (id integer); 
 
CREATE TRIGGER fk_insert_foo 
BEFORE INSERT ON foo 
    FOR EACH ROW  
    BEGIN 
      SELECT RAISE(ROLLBACK, 'insert on table foo violates foo.id ' 
                             + 'constraint on union of bar1.id and bar2.id') 
      WHERE NOT (EXISTS (SELECT * FROM bar1 WHERE bar1.id=NEW.id) 
                 OR  
                 EXISTS (SELECT * FROM bar2 WHERE bar2.id=NEW.id)); 
    END; 
 
insert into foo values (1); 
insert into foo values (2); 
insert into foo values (3); 
select * from foo; 
insert into foo values (4); # <<<<<< this fails