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