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

时间:2012-04-07 14:36:29

标签: python sql join sqlite foreign-keys

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

1 个答案:

答案 0 :(得分:1)

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

请参阅此链接,作者几乎告诉您如何在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