`

SQLite外键的实现

阅读更多

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

 

分享到:
评论

相关推荐

    用触发器实现SQLite的外键约束

    最近在做数码相框上的嵌入式开发,开发过程中使用的SQLite数据库,但是编码的过程中,遇到个问题,SQLite不支持外键约束,外键约束会被解析但不会被执行。

    默认开启外键约System.Data.SQLite.dll束重新编译版1.0.85.0

    System.Data.SQLite.dll默认开启外键约束重新编译版,文件版本1.0.85.0,官网源码,除了开启外键约束,未作任何修改,内含.net2.0、.net4.0的32bit和64bit的release,以及源码修改说明。

    C#从实体类映射到数据库(sqlite)

    开发过程中经常会遇到实体类保存到数据库的需求。通常就是建好数据库,映射到项目中。这个代码是从代码实体类到数据库(C#+sqlite),其他语言和数据库可用来参考

    SQLite Expert 非常好用的SQLite管理软件(含注册)

    表列,索引,外键,触发器,独特和检查约束的可视化编辑器。 任何复杂的表,而不会丢失数据重组。 任何重组操作被包裹在一个嵌套事务回滚,如果发生任何错误更改应用时。 导入和导出数据 从ADO数据源,CSV...

    SQLiteExpert 带破解

    -表列,索引,外键,触发器,独特和检查约束的可视化编辑器。 -任何复杂的表,而不会丢失数据重组。 -任何重组操作被包裹在一个嵌套事务回滚,如果发生任何错误更改应用时。 导入和导出数据: -从ADO数据源,CSV...

    SQL 级联删除与级联更新的方法

    当你更新或删除主键表时,那么外键表也会跟随一起更新或删除,需要在建表时设置级联属性 CREATE TABLE Countries(CountryId INT PRIMARY KEY) INSERT INTO Countries (CountryId) VALUES (1) INSERT INTO Countries ...

    SQLite 中文帮助pdf

    select * from sqlite_temp_master --获取临时表集合 select * from sqlite_master --获取表集合 select CURRENT_DATE --获取电脑日期 select sqlite_version()--获取SQLite的版本号 PRAGMA table_info('keys');--...

    SQLite Expert Professional 3[3.5.39.2459] 最新版

    表列,索引,外键,触发器,独特和检查约束的可视化编辑器。 任何复杂的表,而不会丢失数据重组。 任何重组操作被包裹在一个嵌套事务回滚,如果发生任何错误更改应用时。 导入和导出数据 从ADO数据源,CSV文件...

    SQLiteExpertPro5.2.3_x64.rar

    -表列,索引,外键,触发器,独特和检查约束的可视化编辑器。 -任何复杂的表,而不会丢失数据重组。 -任何重组操作被包裹在一个嵌套事务回滚,如果发生任何错误更改应用时。 导入和导出数据: -从ADO数据源,CSV...

    SQLite数据库管理工具 SQLiteExpert免费官方正版

    表列,索引,外键,触发器,独特和检查约束的可视化编辑器。 任何复杂的表,而不会丢失数据重组。 任何重组操作被包裹在一个嵌套事务回滚,如果发生任何错误更改应用时。 导入和导出数据 从ADO数据源,CSV...

    Adminers MYSQL/SQLite管理工具.rar

    具体的Mysql/SQLite管理功能如下:  1:创建,修改,删除索引/外键/视图/存储过程和函数。  2:查询,合计,排序数据。  3:新增/修改/删除记录。  4:支持所有数据类型,包括大字段。  5:能够批量...

    sqlite3-3.26.0.zip

    这是 SQLite3 V3.26.0 的重新编译版本,加入了默认外键约束,使用时无需手动打开即可支持外键约束。

    asorm1.0beta android Sqlite3 ORM 框架;

    asorm1.0beta android Sqlite3 ORM 框架; 一个安卓上面的数据sql与对象之间的映射框架; 支持自动事务,自动创建表;不支持外键,存储过程;

    将外键助手添加到迁移中,并将外键正确地转储到schema.rb-Ruby开发

    支持以下适配器:mysql2 postgres sqlite(f Foreigner Foreigner为迁移添加和删除外键约束引入了一些方法。它还将外键转储到schema.rb。支持以下适配器:mysql2 postgres sqlite(外键方法是无操作的)在Rails 4.2...

    CRUD_EF_SqLite_Migrations:使用实体框架,SqLite,迁移在C#中进行分类

    CRUD_EF_SqLite_Migrations 使用Entity Framework,SqLite,Migrations迁移C#。移民创建一个迁移。 生成可以更新数据库的代码,以使其与模型的一组更改同步。 更新数据库。 应用挂起的迁移以更新数据库架构。 ...

    AndroidSqlite数据库操作封装SQLiteUtils.zip

    缺点和不足:还没支持多对一或者一多的关系没支持联合主键没支持表的外键设计其他...实例:SqliteLookup(Android内查看Sqlite数据库利器): https://github.com/YeDaxia/SqliteLookup 标签:SQLiteUtils

    Sqlite2CoreData:将标准 Sqlite 数据库迁移到核心数据的工具

    外键信息用于生成关系信息。 有关更多详细信息和示例用法,请访问 这是什么? 命令行工具 Xcdatamodeld 生成器 数据迁移器到与核心数据兼容的 Sqlite 它不是什么? 核心数据版本更新器 核心数据替换 核心数据...

    swift-用于sqlite数据库差量升级

    用于sqlite数据库差量升级。支持的升级能力包括 1,新建表、删除表、重命名表 2,新增字段(新增的字段只支持如下约束:default、pk、not null) 3,新建索引、删除索引 不过还不支持有外键约束存在的升级。

    mysql2sqlite:使用 php、pdo 或 exe 将 mysql 数据库转换为 sqlite 数据库-开源

    包括两个项目:A) 一个 php 脚本 B) 一个基于 python 脚本的 Windows 可执行文件 转换数据、索引和外键约束。 关于 php 脚本:-不需要很多内存-良好的速度 预计在 VDS/VPS 上使用。 用法:wget ...

Global site tag (gtag.js) - Google Analytics