1、什么是主键、外键
主键是指数据表中能唯一识别一条记录,并且被设置为 PRIMARY KEY的字段。主键可以是一个单一的字段,也可以是联合的多个字段。比如,下面建表SQL中就将 userId 设置为主键。
CREATE TABLE `user` (
`userId` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`sex` int(11) NOT NULL,
`job` int(11) NOT NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
下面的建表SQL中将 organ 表的 userId 设置为外键,该外键引用 user 表的 userId 字段,因此 user 表被设置成 organ 表的主表,organ表即为 user 表的子表。子表的外键,必须是主表的主键。
CREATE TABLE `organ` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userId` int(11) DEFAULT NULL,
`type` int(11) DEFAULT NULL,
`score` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `uk` (`userId`),
CONSTRAINT `uk` FOREIGN KEY (`userId`) REFERENCES `user` (`userId`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
外键的作用主要是建立主表和子表的从属关系,以保证数据现实意义的完整。比如,我们有一个学生信息表和一个学生成绩表,其中学生信息表是主表,它的学号是主键也是学生成绩表的外键。如果某个学号在学生信息表中不存在,那么我们就不能在学生成绩表中添加该学号的学生成绩。如果将某个学生从学生信息表删除,那么学生成绩表中跟该学生相关的记录都变得没有存在价值,也应当被删除。
2、子表的删除、更新策略
子表的删除更新策略一共有四种:
1)CASCADE 级联策略。使用此种策略时主表的记录被删除或者主键字段被修改时会同步删除或修改子表
2)NO ACTION 无动作策略。使用此种策略时要删除主表必须先删除子表,要删除主表的记录必须先删除子表关联的记录,不能更新主表主键字段的值。
3)RSTRICT 主表约束策略。此种策略对主表的约束跟 NO ACTION 一样
4)SET NO 置空策略。使用此种策略时,如果主表被删除或者主键被更改,则将子表中的外键设置为NULL。需要注意的是,如果子表的外键是主键或者是设置为NOT NULL的,则主表的删除和主键的更改跟 NO ACTION 一样。