1.首先打开外键开关.
因为sqlite3外键默认是关闭的,所以你要使用就要先打开.
PRAGMA foreign_keys = ON
//要在bridge.h里引入 #import <SQLite3.h>
NSString *sql = @"PRAGMA foreign_keys = ON";
sqlite3_prepare_v2(sqlite, [sql UTF8String], -1, &stmt, NULL);
sqlite3_step(stmt);
使用FMDB:
// objective-c
[db executeUpdate:@"PRAGMA foreign_keys=ON;”];
// swift
db.executeStatements("PRAGMA foreign_keys=ON;”)
2.设置foreign key
1.先建一个父表
"CREATE TABLE IF NOT EXISTS parent (id text PRIMARY KEY NOT NULL);"
2.再建一个子表
"CREATE TABLE IF NOT EXISTS child (id text PRIMARY KEY NOT NULL ,parentID TEXT,FOREIGN KEY (parentID) REFERENCES parent(id) ON DELETE CASCADE ON UPDATE CASCADE);"
child表里的parentID关联到parent表里的id.
ON DELETE 和 ON UPDATE,表示当发生delete和update时,会发生什么行为
- NO ACTION:默认的,表示没有什么行为.
- RESTRICT:当有一个child关联到parent时,禁止delete或update parent
- SET NULL:当parent被delete或update时,child的的关联字段被置为null(如果字段有not null,就出错)
- SET DEFAULT:类似于SET NULL (是不是设置默认值?没有试过)
- CASCADE:将实施在parent上的删除或更新操作,传播给你吧与之关联的child上.
对于 ON DELETE CASCADE, 同被删除的父表中的行 相关联的子表中的每1行,也会被删除.
对于ON UPDATE CASCADE, 存储在子表中的每1行,对应的字段的值会被自动修改成同新的父键匹配
3.使用注意
不论update,insert,replace,要涉及到外键的改变的,要确保父表的存在,否则会因为约束的存在,导致操作失败.