欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 开始

  1. [CONSTRAINT [symbol]],指定约束名字,不写则系统自动生成外键约束名;
  2. MySQL强制外键约束的列上必须要有索引, [index_name]指定索引名,不写则系统自动生成索引名,如果已经存在可以用于支持外键约束的索引,那么指定的索引名则无效,采用已有的索引
  3. (col_name, ...)从表的列名,
  4. 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

创建外键可能失败的原因

  1. 我自己遇到的情况是建表的最后语句ENGINE=INNODB DEFAULT CHARSET=utf8mb4,主表的CHARSET=utf8mb4,而创建从表时用的CHARSET=utf8,导致Cannot add foreign key constraint
  2. 再有就是从表的外键列的名称和数据类型要和主表的一致
相关标签: 数据库