2012-04-07 56 views
2

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

+0

也许去除蟒蛇标签,因为这关系不大吧 – 2012-04-07 18:40:45

回答

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 
+0

谢谢, 有用。虽然,这种方法有一个缺点foo表不会显示任何与bar1和bar2的链接 – 2012-04-07 18:22:15

+0

我主要与你有关(即没有ORM自动检测链接),但根据什么FK是为sqlite,那里只能是一个引用(即父)表每个FK:http://www.sqlite.org/syntaxdiagrams.html#foreign-key-clause – 2012-04-07 18:32:33

+0

我创建了一个新表,并添加了一个代码来自动插入或删除其中的数据如果bar1或bar2插入或删除发生。这将始终保持此表更新,然后将foo链接到它。 – 2012-04-08 03:08:17

相关问题