用触发器实现SQLite的外键约束
用sqlite的觸發(fā)器實(shí)現(xiàn)刪除時(shí),要關(guān)閉外鍵,要不然會(huì)有出現(xiàn)刪不了外鍵對(duì)應(yīng)鍵的情況。
http://hanover.iteye.com/blog/585749
? ? 最近在做數(shù)碼相框上的嵌入式開發(fā),開發(fā)過(guò)程中使用的SQLite數(shù)據(jù)庫(kù),但是編碼的過(guò)程中,遇到個(gè)問(wèn)題,SQLite不支持外鍵約束,外鍵約束會(huì)被解析但不會(huì)被執(zhí)行。?
??? 參考了網(wǎng)上的做法,自己做了個(gè)實(shí)驗(yàn),用觸發(fā)器來(lái)實(shí)現(xiàn)了SQLite的外鍵約束。?
??? 建表語(yǔ)句:?
CREATE TABLE jokeItem?
(?
??? id integer primary key,?
??? content TEXT,?
??? classId integer?
);?
CREATE TABLE jokeClass?
(?
??? classId integer primary key,?
??? className TEXT?
);??
??? 創(chuàng)建插入觸發(fā)器:?
CREATE TRIGGER FK_INSERT?
BEFORE INSERT ON jokeItem?
FOR EACH ROW BEGIN?
SELECT RAISE(ROLLBACK,'No this classId in jokeClass')?
WHERE (SELECT classId FROM jokeClass WHERE classId = NEW.classId) IS NULL;?
END;?
??? 插入操作的外鍵支持效果:?
?
??? 創(chuàng)建更新觸發(fā)器:?
CREATE TRIGGER FK_UPDATE?
BEFORE UPDATE ON jokeItem?
FOR EACH ROW BEGIN?
SELECT RAISE(ROLLBACK,'No this classId in jokeClass')?
WHERE (SELECT classId FROM jokeClass WHERE classId = NEW.classId) IS NULL;?
END;?
??? 更新操作的外鍵支持效果:?
?
??? 創(chuàng)建刪除觸發(fā)器:?
CREATE TRIGGER FK_DELETE?
BEFORE DELETE ON jokeClass?
FOR EACH ROW BEGIN?
DELETE FROM jokeItem WHERE classId = OLD.classId;?
END;?
??? 刪除操作的外鍵支持效果:?
總結(jié)
以上是生活随笔為你收集整理的用触发器实现SQLite的外键约束的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux mmap 内存映射
- 下一篇: SQLite关于时间段查询的sql