通常说到外键,只会提到“外键的目的是确定资料的参考完整性(referential integrity)。”,但是外键具体包含哪些动作和含义呢? 1、设置外链: (1)、通过create table创建外键: 看2行代码,是建表中的命令:
注:ON update cascade ON Delete cascade级联更新和级联删除。 通常在设置外链时,都会先设置外链字段的索引,如上:key idx_fk_country_id (country_id),但这不是非必需的,上面代码中:
这些是可以省去的,直接从FOREIGN KEY开始。当然,如果要给外链命名,则constraint 是必需要的, 如果没有key idx_fk_country_id (country_id),这行时,在设置外链后,mysql会自动加上key索引(即标准index索引).可以在建完表后用show create table city;来查看。 ALTER TABLE city ADD INDEX idx_city(countryid); ALTER TABLE city ADD CONSTRAINT fk_city_country FOREIGN KEY (countryid) REFERENCES country(country_id) ON DELETE CASCADE; ALTER TABLE tbname DROP FOREIGN KEY fk_fkname; 3、外链的具体动作: 注意,on DELETE restrict和on DELETE cascade不能同时定义 默认动作1: 当增加子表中外键值时,如果父表主键不存在该值时,则禁止插入。 默认动作2: 当主表删除某记录时,如果子表有对应该录的内容时,禁止删除 因此,上面的可以on DELETE restrict略去。 非默认动作——级联更新: 当父表更新主键时,如果子表有对应记录,则自动更新子表,这一动作用ON update cascade来实现。 非默认动作——级联删除: 当父表更新主键时,如果子表有对应记录,则自动更新子表,这一动作用ON Delete cascade来实现。 a、set null : 表示父表在更新或删除时,子表对应的字段被set null. b、no action : 和restrict相同,限制在子表有关联记录的情况下父表不能更新。 5、临时关闭外键检查: 常用于: A、导入多个表数据时,需要忽略之前表的导入顺序, B、执行LOAD DATA和ALTER TABLE操作时。 命令: set foreign_key_checks=0 完成之后,重新开启外键检查用set foreign_key_checks=1;来恢复 |