MySQL创建gatt_descriptors表报1005错误 errno150外键约束格式错误
错误原因
外键约束创建失败的核心原因是InnoDB引擎的外键规则不满足,具体为以下两点:
- 外键引用的父表列组合必须存在对应索引:你在
gatt_descriptors中定义的外键需要引用gatt_characteristics表的(char_name, service_name, version)三个列的组合,但gatt_characteristics当前仅为char_name单列创建了主键索引,没有这三个列的联合索引,无法匹配外键要求。 - 外键列和被引用列的属性必须完全一致:
gatt_descriptors中char_name字段定义为允许为NULL,但父表gatt_characteristics的char_name是主键,属性为NOT NULL,二者属性不匹配。
另外还有一个之前建表时遗留的潜在问题:gatt_characteristics中引用gatt_services的外键仅单独引用了service_name列,但gatt_services的主键是(service_name, version)联合主键,单独引用单列本身也不符合外键规则,只是之前没有触发报错。
解决方案
按以下步骤调整即可:
- 修复
gatt_characteristics的外键和索引配置
-- 首先查看gatt_characteristics原有外键名称 SHOW CREATE TABLE gatt_characteristics; -- 删除原有引用gatt_services的错误外键,将下方<外键名>替换为你查到的实际名称 ALTER TABLE gatt_characteristics DROP FOREIGN KEY <外键名>; -- 新增符合gatt_services联合主键的联合外键 ALTER TABLE gatt_characteristics ADD FOREIGN KEY (service_name, version) REFERENCES gatt_services(service_name, version) ON DELETE RESTRICT ON UPDATE CASCADE; -- 给(char_name, service_name, version)添加联合索引,满足后续外键引用要求 -- 你也可以直接将这三个列设为联合主键,和其他表的设计风格保持一致 CREATE INDEX idx_char_serv_ver ON gatt_characteristics(char_name, service_name, version);
- 修改
gatt_descriptors的建表语句,修正char_name的属性
CREATE TABLE gatt_descriptors( descriptor_name VARCHAR(25) NOT NULL, uuid VARCHAR(36), id VARCHAR(36), val_const BIT, init_val VARCHAR(25), var_length BIT, val_length INT, read_val VARCHAR(7), write_val VARCHAR(7), version INT NOT NULL, service_name VARCHAR(25) NOT NULL, char_name VARCHAR(25) NOT NULL, -- 新增NOT NULL和父表属性匹配 FOREIGN KEY (char_name, service_name, version) REFERENCES gatt_characteristics (char_name, service_name, version) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT pk_verserchardescr PRIMARY KEY (descriptor_name, char_name, service_name, version));
执行完以上调整后即可正常建表。
内容的提问来源于stack exchange,提问作者earthling
相关产品推荐
相关产品推荐

