创建FAQ表关联Product表时遇MySQL外键定义错误求助
解决外键关联错误:Key reference and table reference don't match
问题根源
你的错误来自两个核心问题:
- 外键字段数量不匹配:Product表的主键是复合主键(
id,version_id),但FAQ表的外键只使用了product_id单个字段,外键要求引用字段的数量、类型必须和被引用的主键/唯一键完全一致。 - 非空约束与删除规则冲突:FAQ表的
product_id被设置为NOT NULL,但外键规则写了ON DELETE SET NULL,这显然矛盾——非空字段不能被设为NULL。
修正方案(二选一)
方案1:FAQ关联Product的具体版本(保留复合主键关联)
如果业务需要FAQ绑定到Product的特定版本,需在FAQ表中同时存储product_id和version_id,并建立复合外键:
CREATE TABLE `faq` ( `id` BINARY(16) NOT NULL, `question` VARCHAR(255) NULL, `answer` VARCHAR(255) NULL, `product_id` BINARY(16) NOT NULL, `product_version_id` BINARY(16) NOT NULL, -- 新增对应version_id的字段 `created_at` DATETIME(3) NOT NULL, `updated_at` DATETIME(3) NULL, PRIMARY KEY (`id`), KEY `fk_faq_product` (`product_id`, `product_version_id`), CONSTRAINT `fk_faq_product` FOREIGN KEY (`product_id`, `product_version_id`) REFERENCES `product` (`id`, `version_id`) ON DELETE CASCADE -- 替换SET NULL,或根据业务需求将product_id设为NULL并移除NOT NULL约束 ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
方案2:FAQ只关联Product本身(忽略版本)
如果FAQ无需绑定特定版本,只需关联Product主体,需先给Product表的id字段单独创建唯一索引(外键只能引用主键或唯一键),再修改FAQ的外键:
- 给Product表添加唯一索引:
ALTER TABLE `product` ADD UNIQUE INDEX `idx_product_id` (`id`);
- 修改FAQ表的外键定义:
CREATE TABLE `faq` ( `id` BINARY(16) NOT NULL, `question` VARCHAR(255) NULL, `answer` VARCHAR(255) NULL, `product_id` BINARY(16) NOT NULL, `created_at` DATETIME(3) NOT NULL, `updated_at` DATETIME(3) NULL, PRIMARY KEY (`id`), KEY `fk_faq_product_id` (`product_id`), CONSTRAINT `fk_faq_product_id` FOREIGN KEY (`product_id`) REFERENCES `product` (`id`) ON DELETE CASCADE -- 若删除Product时需保留FAQ,可将product_id设为NULL并移除NOT NULL约束 ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
内容的提问来源于stack exchange,提问作者Raymon
相关产品推荐
相关产品推荐

