外键作为表与表之间关联的字段,主要用来保证数据的完整性和一致性。就像下面的两表ORGID 就是两表的关联字段。
A表
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //主键自增
//@GenericGenerator(name="system-id", strategy = "uuid.hex")
@Column(name = "USERID")
private int userId;
@Column(name = "USERNAME")
private String userName;
@Column(name = "SEX")
private int sex;
@Column(name = "DEGEREE")
private Double degeree;
@Column(name = "ORGID")
B表
@Id
@Column(name = "ORGID")
private int orgId;
@Column(name = "OEGNAME")
private String orgName;
@Column(name = "ORGDEGREE")
private Double orgDegree;
(一)父子表区分
首先明确一个概念,假如表A(USERID,USERNAME,SEX,DEGEREE,ORGID),表B(ORGID,OEGNAME,ORGDEGREE),我们说表A参考了表B的主键作为其外键使用,所以B表示父表,A表是子表
(二)删除和更新有四种设置方式
(1)cascade:级联,当父表(B表)更新、删除,子表(A表)会同步更新和删除,如果字表删除,更新,则只会影响字表,对父表不做更改。新增时父表有关联数据 子表才能新增,但是外键选择只能在主表里面选。单纯只增加某一张表是不行的。
(2)set null:置空,当父表更新、删除的时候,字表会把外键字段变为null,所以这个时候设计表的时候该字段要允许为null,否则会出错
(3)restrict:父表在删除和更新记录的时候,要在子表中检查是否有有关该父表要更新和删除的记录,如果有,则不允许删除或更改
(4)no action:和restrict一样
(三)具体创建
两个表必须是InnoDB表,MyISAM表暂时不支持外键
外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;
外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;
1:外键约束使用最多的两种情况:
如果想达到父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;则:
在外键定义中,我们使用ON UPDATE CASCADE ON DELETE RESTRICT;
父表更新时子表也更新,父表删除时子表匹配的项也删除;则:
可以使用ON UPDATE CASCADE ON DELETE CASCADE。
article 子表
CREATE TABLE IF NOT EXISTS article (
id int(11) NOT NULL AUTO_INCREMENT,
category_id int(11) NOT NULL,
name char(16) NOT NULL,
#主键
PRIMARY KEY (id),
#KEY为索引。 fk_1为起了一个名字
KEY fk_1 (category_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2;
category 父表
CREATE TABLE IF NOT EXISTS category (
id int(11) NOT NULL AUTO_INCREMENT,
name char(16) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2;
2:创建外键约束(fk_2只是起了一个名字而已。上面两表article 为子表):
ALTER TABLE article ADD CONSTRAINT fk_2 FOREIGN KEY (category_id)
REFERENCES category (id)
ON DELETE CASCADE ON UPDATE CASCADE
如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT:
3:删除外键
ALTER TABLE article DROP FOREIGN KEY fk_2