MySQL的外键约束

本文介绍了数据库中的外键约束概念,包括其作用和创建方法。外键约束确保了从表的数据完整性,但根据阿里巴巴的JAVA规范,不推荐在数据库层面使用。创建外键约束的语法和案例进行了展示,并讨论了可能导致外键创建失败的原因,如字符集不一致。建议在应用层处理外键关系以遵循最佳实践。
摘要由CSDN通过智能技术生成

阿里的JAVA规范中也明确规定:【强制】不得使用外键与级联,一切外键概念必须在应用层解决。所有此处只做了解,工作中不要使用

什么是外键约束

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. FOREIGN KEY (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. 再有就是从表的外键列的名称和数据类型要和主表的一致
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值