iOS sqlite3外键级联删除问题解决

最近学习使用数据库,以前上学的时候也学过外键和级联删除。

NSString *sql=@"CREATE TABLE PlanModel (Id integer,name text,constraint plan_key primary key (Id))";

NSString *sql=@"CREATE TABLE SystemModel (Id integer,planId integer,name text,foreign key (planId) references PlanModel(Id) on delete cascade on update cascade,constraint system_key primary key (Id,planId))";

照理说在建表的时候sql语句如上面这段语句就行了,但是经过实验证明了并没有级联删除,即SystemModel中删除了,本表中关于PlanModel的id对应的纪录并没有删除。经过查阅发现,sqlite支持级联,但默认级联属性是关团的。

NSString *foreign=@"PRAGMA foreign_keys=1"

[[DBManager sharedDBManager] executeNonQuery:foreign];

NSString *sql=[NSString stringWithFormat:@"DELETE FROM PlanModel WHERE Id=‘%@‘",model.Id];

[[DBManager sharedDBManager] executeNonQuery:sql];

在执行删除的sql语句前先执行"PRAGMA foreign_keys=1"就可以了。

时间: 2024-08-10 13:52:25

iOS sqlite3外键级联删除问题解决的相关文章

Oracle外键级联删除和级联更新

1 级联删除 Oracle在外键的删除上有NO ACTION(类似RESTRICT).CASCADE和SET NULL三种行为. 下面以学生-班级为例说明不同情况下的外键删除,学生属于班级,班级的主键是学生的外键. -- 班级表 CRATE TABLE TB_CLASS ( ID NUMBER NOT NULL, --班级主键 NAME VARCHAR2(50), --班级名称 CONSTRAINT PK_TB_CLASS PRIMARY KEY (ID) ); -- 学生表 CREATE TA

[Django]orm中的外键级联删除

这里的系统环境为django1.6   os为win7 今天有个需求说的是添加一个地区表,然后用外键和几个非常重要的实体表来做关联(地区表作为其他表的外键),写完地区的删除操作的时候,测试了下代码,功能正常.可是眼睛移动到控制台输出的时候傻了 connexesql ->DELETE FROM `mngm_device` WHERE `mngm_device`.`area_id` IN (%s, %s, %s) connexesql ->DELETE FROM `ad_ad` WHERE `ad

python django中的orm外键级联删除

今天添加了一个路由表,路由表做外键,然后添加了几个组,路由表为组的外键,当我使用删除功能对路由表进行删除时,竞然将我的组也相当的删除了:尽管这是测试,但放到生产环境中还是会发生意外的:这个问题要解决: 在网上查了一下资料,问题主要是django orm的field字段有关: routemgr = models.ForeignKey('Routemgr',default=1,blank=True,null=True,on_delete=models.SET_NULL) 主要意思就是把Routemg

【Mysql】外键级联与级联的劣势

在建表的时候时候,可以对于删除delete.修改update设置为级联.用一个例子先说明外键级联级联的概念 假如数据库中本以存在一张usertable如下: 此user表非常简单,id为主键. 下面我将新建一张cascade_test表如下,这里的user_id与usertable的主键id形成参照完整性,并同时建立删除与修改的级联: 如果用SQL语句建立上图的表则如下: CREATE TABLE `test`.`cascade_test` ( `id` INTEGER UNSIGNED NOT

外键 级联更新/删除 复制表 修改表

引入 所有的信息都记录在一张表中所带来的问题 1.表的结构不清晰   太乱 2.浪费硬盘空间     dep_name 重复太多 3.表的扩展性极差(无法忽略的缺点)    想改其中的一个部门需要连着改好多 类似于我们将所有的代码都写在用一个py文件内 确立表与表之间的关系 一定要换位思考(必须两方都考虑周全之后才能得出结论) 一对多 以员工表和部门表为例 先站在员工表看能否有多个员工对应一个部门 翻译过来: 一个部门能否有多个员工 可以!!!(暂时只能确定员工单向多对一部门) 再站在部门表看能

mysql外键级联更新删除

MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作,包括RESTRICT.NO ACTION.SET NULL和CASCADE.其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新:CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录:SET NULL则是表示父表在更新或者删除的时候,子表的对应字段被S

MySQL数据库 外键,级联, 修改表的操作

1.外键: 用来建立两张表之间的关系 - 一对多 - 多对多 - 一对一 研究表与表之间的关系: 1.定义一张 员工部门表 id, name, gender, dep_name, dep_desc - 将所有数据存放在一张表中的弊端: 1.结构不清晰 ---> 不致命 2.浪费空间 ---> 不致命 3.可扩展性极差 ---> 不可忽视的弊端 - 类似于将所有python代码存放在一个py文件中,强耦合到一起了----> 解耦合 ----> 拆分表 - 拆分表解决以上问题.

8. EF Core 外键的删除模式

一.在删除有其它表的外键引用的数据有一下几种方式 1.不执行任何操作(EF Core默认Restrict):如果数据被其其他表外键依赖,拒绝删除 2.级联(Cascade):删除外键表中相应的所有行 3.设置NULL(SetNull):将表的外键字段值设置为空值NULL 4.设置默认值:如果外键表的所有外键列均已定义默认值,则将该列设置为默认值 级联删除例子 modelBuilder.Entity<Post>().HasOne(p => p.Blog).WithMany(b =>

Oracle删除表时候有外键 不能删除

SELECT    A .constraint_name,    A .table_name,    b.constraint_nameFROM    user_constraints A,    user_constraints bWHERE    A .constraint_type = 'R'AND b.constraint_type = 'P'AND A .r_constraint_name = b.constraint_nameAND A .constraint_name = UPPE