1.首先打開外鍵開關(guān).
因為sqlite3外鍵默認是關(guān)閉的,所以你要使用就要先打開.
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.設(shè)置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關(guān)聯(lián)到parent表里的id.
ON DELETE 和 ON UPDATE,表示當(dāng)發(fā)生delete和update時,會發(fā)生什么行為
- NO ACTION:默認的,表示沒有什么行為.
- RESTRICT:當(dāng)有一個child關(guān)聯(lián)到parent時,禁止delete或update parent
- SET NULL:當(dāng)parent被delete或update時,child的的關(guān)聯(lián)字段被置為null(如果字段有not null,就出錯)
- SET DEFAULT:類似于SET NULL (是不是設(shè)置默認值?沒有試過)
- CASCADE:將實施在parent上的刪除或更新操作,傳播給你吧與之關(guān)聯(lián)的child上.
對于 ON DELETE CASCADE, 同被刪除的父表中的行 相關(guān)聯(lián)的子表中的每1行,也會被刪除.
對于ON UPDATE CASCADE, 存儲在子表中的每1行,對應(yīng)的字段的值會被自動修改成同新的父鍵匹配
3.使用注意
不論update,insert,replace,要涉及到外鍵的改變的,要確保父表的存在,否則會因為約束的存在,導(dǎo)致操作失敗.