InnoDB 支持 foreign key constraints.
constraint definition in InnoDB
looks like this:
[CONSTRAINT [symbol
]] FOREIGN KEY [index_name
] (index_col_name
, ...) REFERENCEStbl_name
(index_col_name
,...) [ON DELETEreference_option
] [ON UPDATEreference_option
]reference_option
: RESTRICT | CASCADE | SET NULL | NO ACTION
在InnoDB引擎中,
1.constranint [symbol] 中symbol如果指定必须唯一。
2.要建立外键,必须对外键和它参照的列上建立索引。
3.外键可以参照一列或几列,并且参照的列和外键可以是在不同的表中,也可以是同一个表。
可选择的外键约束种类有,RESTRICT | CASCADE | SET NULL | NO ACTION 四种。
外键约束对子表的含义:
如果在父表中找不到候选键,则不允许在子表上进行insert/update
外键约束对父表的含义:
在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,
父表的行为取决于:在定义子表的外键时指定的on update/on delete子句,
InnoDB支持4种方式, 分列如下
. cascade方式
在父表上update/delete记录时,同步update/delete掉子表的匹配记录,
Both ON DELETE CASCADE
and ON UPDATE CASCADE
are supported.
Note:cascaded foreign key actions do not activate triggers
. set null方式
在父表上update/delete记录时,将子表上匹配记录的列设为null
要注意子表的外键列不能设置为not null。
Both ON DELETE SET NULL
and ON UPDATE SET NULL
clauses are supported.
. Restrict方式
拒绝在父表上的删除或更新,此时如果我们将忽略其他定义在其上的约束如(ON DELETE or ON UPDATE
clause)
. No action方式
如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
这个是ANSI SQL-92标准,从mysql4.0.8开始支持
在Mysql 中 Restrict 和No action 的意义是一样的。
参见 Mysql Manual: Foreign Key constraint