外键约束的要求
父表和子表必须使用相同的储存引擎,而且禁止使用临时表
数据表的储存引擎只能为InnoDB:
外键列(字段)和参照列必须具有相似的数据类型,其中数字的长度或是否有符号位必须相同,而字符类型的字段的长度则可以不同
外键列(字段)和参照列(即外键列在另一个表中对应的主键列)必须创建索引,如果外键不存在索引(即外键约束)的话,MySQL将自动给外键列自动创建索引(外键约束)
步骤
- 设置储存引擎
my.ini 设置储存引擎
default-storage-engine=INNODB
- 创建两张数据表(例):
CREATE TABLE provinces(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
proName VARCHAR(20) NOT NULL
);
SHOW CREATE TABLE provinces; // 查看数据表创建详细信息
CREATE TABLE users(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
userName VARCHAR(10) NOT NULL,
pid SMALLINT UNSIGNED,
FOREIGN KEY (pid) REFERENCES provinces(id)
);
如果 外键字段和参照列字段数据类型不同,会报1005错误
外键约束的操作:
CASCADE:从父表删除或更新会自动删除或更新子表中匹配的行
SET NULL:从父表删除或更新行,会设置子表中的外键列为NULL,但必须保证子表列没有指定NOT NULL
RESTRICT:拒绝对父表的删除或更新操作(如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作,这个是ANSI SQL-92标准,从mysql4.0.8开始支持)
NO ACTION:标准SQL的关键字,在mysql中与RESTRICT相同