SQLite外來鍵的實現

2021-06-03 03:28:42 字數 1976 閱讀 4484

sqlite現在的版本還不支援外來鍵功能,雖然外來鍵約束會被解析,但執行的時候被忽略。但我們可以手動實現外來鍵,實現的原理就是觸發器。下面是我的實現方法。主要是針對乙個例子:

先看下面兩個表。

create table plu (pluid integer not null primary key,

name text not null,

property text,

price double not null,

left integer not null,

department text,

other text);

create table plusuit (suitid integer not null primary key,

price double not null,

property text,

name text not null,

pluid integer not null constraint fk_plu_id references plu(pluid) on delete cascade,

numbers integer not null)

這樣就為plusuit表建立對plu表的外來鍵約束,這樣就可以實現core2資料需求中的要求,問題是sqlite不執行這個約束,所以這樣建立以後,我們還要再建立三個觸發器,insert,update,delete觸發器:

before insert on plusuit

for each row begin

select raise(rollback, 'insert on table "plusuit" violates foreign key constraint "fk_plu_id"')

where  (select pluid from plu where pluid = new.pluid) is null;

end;

before update on plusuit

for each row begin

select raise(rollback, 'update on table "plusuit" violates foreign key constraint "fk_plu_id"')

where  (select pluid from plu where pluid = new.pluid) is null;

end;

create trigger fkd_plusuit_pluid

before delete on plu

for each row begin

delete from plusuit where pluid = old.pluid;

end;

下面我們分別來作三個實驗:

一、插入實驗

首先我們在plu裡面插入乙個資料(一雙anta運動鞋的資訊):

insert into plu values(1,'anta','sport',299,100,'sales','ok');

insert into plu values(3,'nike','sport',699,200,'sales','ok');

然後我們開始在plusuit裡面插入乙個資料(兩雙一起打折賣):

insert into plusuit values(100,350,'old','anta',1,2);成功了

insert into plusuit values(100,350,'old','anta',2,2);失敗,得到正確的錯誤資訊

更新實驗

update plusuit set pluid=2 where suitid=100;失敗,得到正確的錯誤資訊

update plusuit set pluid=3 where suitid=100;成功

刪除實驗

delete from plu where pluid=1;

檢視plusuit中資料被正確刪除。

實驗結果,觸發器的實現完全正確。

用觸發器實現SQLite的外來鍵約束

用sqlite的觸發器實現刪除時,要關閉外來鍵,要不然會有出現刪不了外來鍵對應鍵的情況。最近在做數碼相框上的嵌入式開發,開發過程中使用的sqlite資料庫,但是編碼的過程中,遇到個問題,sqlite不支援外來鍵約束,外來鍵約束會被解析但不會被執行。參考了網上的做法,自己做了個實驗,用觸發器來實現了s...

用觸發器實現SQLite的外來鍵約束

最近在做數碼相框上的嵌入式開發,開發過程中使用的sqlite資料庫,但是編碼的過程中,遇到個問題,sqlite不支援外來鍵約束,外來鍵約束會被解析但不會被執行。參考了網上的做法,自己做了個實驗,用觸發器來實現了sqlite的外來鍵約束。建表語句 create table jokeitem id in...

SQLite 外來鍵 級聯更新 刪除

自身關聯 create table business id varchar 50 not null primary key,name varchar 200 not null,parent id varchar 50 configurationpage boolean not null,foreig...