SQLite用触发器来替代外键约束
下面文章出处:
http://hi.baidu.com/wastorode/blog/item/3c8bfefe7460e8c9b48f318e.html
参考了网上的做法,自己做了个实验,用触发器来实现了SQLite的外键约束。
建表语句:
CREATE TABLE jokeItem
(
id integer primary key,
content TEXT,
classId integer
);
CREATE TABLE jokeClass
(
classId integer primary key,
className TEXT
);
创建插入触发器:
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;
插入操作的外键支持效果:
创建更新触发器:
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;
更新操作的外键支持效果:
创建删除触发器:
CREATE TRIGGER FK_DELETE
BEFORE DELETE ON jokeClass
FOR EACH ROW BEGIN
DELETE FROM jokeItem WHERE classId = OLD.classId;
END;
删除操作的外键支持效果:
原文出处:http://edu.codepub.com/2010/0318/21120.php
CREATE TABLE [Category] ( CREATE TABLE [Product] ( --Insert约束 --Update约束
原文出处:http://www.byz5.com/html/236/2/2418/1.htm
SQLite现在的版本还不支持外键功能,虽然外键约束会被解析,但执行的时候被忽略。但我们可以手动实现外键,实现的原理就是触发器。下面是我的实现方法。主要是针对一个例子: CREATE TABLE PluSuit (SuitID integer NOT NULL PRIMARY KEY, BEFORE INSERT ON PluSuit BEFORE UPDATE ON PluSuit CREATE TRIGGER fkd_plusuit_pluid 下面我们分别来作三个实验: 更新实验 delete from PLU where PluID=1; 查看PluSuit中数据被正确删除。 实验结果,触发器的实现完全正确。
|