MySQL的外键约束
程序员文章站
2022-06-01 09:49:34
...
文章目录
什么是外键约束
A表的主键在B表中出现(A表示主表,B表示从表),并且B表中的这个字段的值必须已经在A表中出现,这个字段对B表来说就是外键约束,外键约束约束的是从表,即从表对外键列的新增和修改都要看主表中这个值是否已经存在
从表创建外键
建立外键约束语法
[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (col_name, ...)
REFERENCES tbl_name (col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
解读
外键创建从CONSTRAINT 开始
-
[CONSTRAINT [symbol]]
,指定约束名字,不写则系统自动生成外键约束名; - MySQL强制外键约束的列上必须要有索引,
[index_name]
指定索引名,不写则系统自动生成索引名,如果已经存在可以用于支持外键约束的索引,那么指定的索引名则无效,采用已有的索引 -
(col_name, ...)
从表的列名, -
REFERENCES tbl_name (col_name,...)
,REFERENCES 后面是主表的表名和列名
案例
CREATE TABLE `qrtz_blob_triggers` (
`sched_name` varchar(120) NOT NULL,
`trigger_name` varchar(200) NOT NULL,
`trigger_group` varchar(200) NOT NULL,
PRIMARY KEY (`sched_name`,`trigger_name`,`trigger_group`),
CONSTRAINT `QRTZ_BLOB_TRIGGERS_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
创建外键可能失败的原因
- 我自己遇到的情况是建表的最后语句
ENGINE=INNODB DEFAULT CHARSET=utf8mb4
,主表的CHARSET=utf8mb4
,而创建从表时用的CHARSET=utf8
,导致Cannot add foreign key constraint
- 再有就是从表的外键列的名称和数据类型要和主表的一致