SQLite外键的实现
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触发器:
create trigger plusuit_insert_trigger
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;
CREATE TRIGGER plusuit_update_trigger
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中数据被正确删除。
实验结果,触发器的实现完全正确。
转:http://www.sqlite.com.cn/MySqlite/6/403.Html
发表评论
-
资料上传备份
2012-07-02 07:28 0对付对付对付对付 -
Android-sharedUserId数据权限
2012-05-02 10:16 1408Android-sharedUserId数据权限 An ... -
Android Service学习之本地服务
2012-04-18 10:28 799转: Android Service学习之本地服务 htt ... -
match_parent和fill_parent的区别 .
2012-02-18 11:49 1783match_parent和fill_parent的区别 有 ... -
Android中SQLiteOpenHelper类的onUpgrade方法的作用
2012-02-09 11:50 4560Android中SQLiteOpenHelper类的onUpg ... -
Android启动各种系统服务线程
2012-02-09 10:59 1896Android启动各种系统服务 ... -
android
2012-02-08 09:22 0Android数据库内容变化的监听 首先介绍内容监 ... -
在线升级Android应用程序的思路
2012-02-07 11:34 821在线升级Android应用程序的思路 http://www. ... -
Android数据库内容变化的监听
2012-02-07 11:31 5990Android数据库内容变化的监听 首先介绍内容监 ... -
android中的数据库操作
2012-02-07 10:50 1410android中的数据库操作 ... -
SQLiteOpenHelper类与自动升级数据库
2012-02-07 10:31 2239SQLiteOpenHelper类与自动升级数据库 S ... -
29日修改数据库设计
2012-01-29 15:24 0数据表设计: 账号信息表account ... -
最新数据库设计
2012-01-28 21:21 0数据表设计: 工资管理 账号信息表Acc ... -
数据库设计
2012-01-11 15:27 0数据库设计 信息表:infotypecreate ta ... -
Android到处都在使用的回调分析
2011-12-21 15:53 3501Android到处都在使用的回调分析 ... -
android中LayoutInflater的使用
2011-12-21 11:35 1899android中LayoutInflater的使用 ... -
cmd下操作mysql
2011-12-20 14:11 923cmd下操作mysql 连接mysql服务器 mysql ... -
SIM卡满处理流程分析
2011-12-19 15:15 1843SIM卡满处理流程分析 //框架层分析 // SMSD ... -
短信发送状态报告流程分析
2011-12-19 15:07 2351短信发送状态报告流程分析 //应用层分析: //Sms ... -
Android平台 短信接送流程剖析(含编码)
2011-12-16 15:29 3195Android平台 短信接送流程剖析(含编码) ...
相关推荐
最近在做数码相框上的嵌入式开发,开发过程中使用的SQLite数据库,但是编码的过程中,遇到个问题,SQLite不支持外键约束,外键约束会被解析但不会被执行。
System.Data.SQLite.dll默认开启外键约束重新编译版,文件版本1.0.85.0,官网源码,除了开启外键约束,未作任何修改,内含.net2.0、.net4.0的32bit和64bit的release,以及源码修改说明。
开发过程中经常会遇到实体类保存到数据库的需求。通常就是建好数据库,映射到项目中。这个代码是从代码实体类到数据库(C#+sqlite),其他语言和数据库可用来参考
表列,索引,外键,触发器,独特和检查约束的可视化编辑器。 任何复杂的表,而不会丢失数据重组。 任何重组操作被包裹在一个嵌套事务回滚,如果发生任何错误更改应用时。 导入和导出数据 从ADO数据源,CSV...
-表列,索引,外键,触发器,独特和检查约束的可视化编辑器。 -任何复杂的表,而不会丢失数据重组。 -任何重组操作被包裹在一个嵌套事务回滚,如果发生任何错误更改应用时。 导入和导出数据: -从ADO数据源,CSV...
当你更新或删除主键表时,那么外键表也会跟随一起更新或删除,需要在建表时设置级联属性 CREATE TABLE Countries(CountryId INT PRIMARY KEY) INSERT INTO Countries (CountryId) VALUES (1) INSERT INTO Countries ...
select * from sqlite_temp_master --获取临时表集合 select * from sqlite_master --获取表集合 select CURRENT_DATE --获取电脑日期 select sqlite_version()--获取SQLite的版本号 PRAGMA table_info('keys');--...
表列,索引,外键,触发器,独特和检查约束的可视化编辑器。 任何复杂的表,而不会丢失数据重组。 任何重组操作被包裹在一个嵌套事务回滚,如果发生任何错误更改应用时。 导入和导出数据 从ADO数据源,CSV文件...
-表列,索引,外键,触发器,独特和检查约束的可视化编辑器。 -任何复杂的表,而不会丢失数据重组。 -任何重组操作被包裹在一个嵌套事务回滚,如果发生任何错误更改应用时。 导入和导出数据: -从ADO数据源,CSV...
表列,索引,外键,触发器,独特和检查约束的可视化编辑器。 任何复杂的表,而不会丢失数据重组。 任何重组操作被包裹在一个嵌套事务回滚,如果发生任何错误更改应用时。 导入和导出数据 从ADO数据源,CSV...
具体的Mysql/SQLite管理功能如下: 1:创建,修改,删除索引/外键/视图/存储过程和函数。 2:查询,合计,排序数据。 3:新增/修改/删除记录。 4:支持所有数据类型,包括大字段。 5:能够批量...
这是 SQLite3 V3.26.0 的重新编译版本,加入了默认外键约束,使用时无需手动打开即可支持外键约束。
asorm1.0beta android Sqlite3 ORM 框架; 一个安卓上面的数据sql与对象之间的映射框架; 支持自动事务,自动创建表;不支持外键,存储过程;
支持以下适配器:mysql2 postgres sqlite(f Foreigner Foreigner为迁移添加和删除外键约束引入了一些方法。它还将外键转储到schema.rb。支持以下适配器:mysql2 postgres sqlite(外键方法是无操作的)在Rails 4.2...
CRUD_EF_SqLite_Migrations 使用Entity Framework,SqLite,Migrations迁移C#。移民创建一个迁移。 生成可以更新数据库的代码,以使其与模型的一组更改同步。 更新数据库。 应用挂起的迁移以更新数据库架构。 ...
缺点和不足:还没支持多对一或者一多的关系没支持联合主键没支持表的外键设计其他...实例:SqliteLookup(Android内查看Sqlite数据库利器): https://github.com/YeDaxia/SqliteLookup 标签:SQLiteUtils
外键信息用于生成关系信息。 有关更多详细信息和示例用法,请访问 这是什么? 命令行工具 Xcdatamodeld 生成器 数据迁移器到与核心数据兼容的 Sqlite 它不是什么? 核心数据版本更新器 核心数据替换 核心数据...
用于sqlite数据库差量升级。支持的升级能力包括 1,新建表、删除表、重命名表 2,新增字段(新增的字段只支持如下约束:default、pk、not null) 3,新建索引、删除索引 不过还不支持有外键约束存在的升级。
包括两个项目:A) 一个 php 脚本 B) 一个基于 python 脚本的 Windows 可执行文件 转换数据、索引和外键约束。 关于 php 脚本:-不需要很多内存-良好的速度 预计在 VDS/VPS 上使用。 用法:wget ...