1.使用外键约束前必须确定sqlite3是恰当的编译版本,原文:In order to use foreign key constraints in SQLite, the library must be compiled with neither SQLITE_OMIT_FOREIGN_KEY or SQLITE_OMIT_TRIGGER defined.
2.外键开关
必须使用pragma打开外键开关以支持外键约束。
sqlite> PRAGMA foreign_keys; 0 sqlite> PRAGMA foreign_keys = ON; sqlite> PRAGMA foreign_keys; 1 sqlite> PRAGMA foreign_keys = OFF; sqlite> PRAGMA foreign_keys; 0
3.外键语句如图(来自sqlite3文档):
4.术语
sqlite中使用父表、子表、父键、子键来描述外键约束。
5.约束性质
子表的记录的外键必须为空或存在父表中,若在父表中则必须为父表的主键或具有unique选项的字段。
也就是一下必须恒为真:
child_table_foreign_key IS NULL OR EXISTS(SELECT primary_key_or_unique_col FROM parent_table WHERE parimary_key_or_unique_col=chidl_table_foreign_key)
当父键所对应的子表记录还存在时,默认情况下不允许删除父键所对应记录。可以使用on delete 或on update选项指定操作。
当必须删除父键对应的子表中的记录时(级联删除),可以使用触发器。
6.创建具有外键约束的表
CREATE TABLE artist( artistid INTEGER PRIMARY KEY, artistname TEXT ); CREATE TABLE track( trackid INTEGER, trackname TEXT, trackartist INTEGER, FOREIGN KEY(trackartist) REFERENCES artist(artistid) );
或
CREATE TABLE track( trackid INTEGER, trackname TEXT, trackartist INTEGER REFERENCES artist(artistid) );
注:使用第二种写法时,貌似MySQL5.0的外键约束会不起作用。因此推荐第一种写法,并最好在前面加上约束名CONSTRAINT symbol;
7.ON DELETE and ON UPDATE Actions
未完,参加