sqlite3 外键的使用

1.首先打开外键开关.

因为sqlite3外键默认是关闭的,所以你要使用就要先打开.

PRAGMA foreign_keys = ON

//要在bridge.h里引入 #import 
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,要涉及到外键的改变的,要确保父表的存在,否则会因为约束的存在,导致操作失败.

你可能感兴趣的:(sqlite3 外键的使用)