2012-04-07 54 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

相關問題