You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB同类型字段创建外键约束失败(errno:150)问题咨询

MariaDB同类型字段创建外键约束失败(errno:150)问题咨询

嘿,我来帮你排查这个外键报错的问题!你遇到的errno: 150 "Foreign key constraint is incorrectly formed"是MariaDB里很常见的外键配置问题,核心原因其实很明确:

关键错误点

外键约束的目标字段必须是父表的主键或者带有**唯一约束(UNIQUE)**的字段。你现在尝试让recieving_item.NAME引用item_general_info.name,但item_general_info里的name字段只是设置了NOT NULL,并没有被标记为唯一的——MariaDB不允许把非唯一字段作为外键的关联目标,因为无法确保子表的每条记录都能对应到父表的唯一行。

另外还有个小细节需要注意:你父表的名称是Item_General_Info(首字母大写),但创建子表时引用的是item_general_info.name。如果你的数据库运行在Linux系统上,表名是区分大小写的,这也可能导致关联失败,建议保持表名字母大小写一致。

两种可行的解决方案

方案一:给父表的name字段添加唯一约束

如果你的业务逻辑里商品名称是唯一的,可以先给父表添加唯一约束,再创建子表:

-- 先修改父表,给name字段添加唯一约束
ALTER TABLE Item_General_Info ADD CONSTRAINT unique_item_name UNIQUE (name);

-- 然后创建子表,明确指定外键约束
CREATE TABLE recieving_item(
    NAME VARCHAR(64) NOT NULL,
    stock INT(11) NOT NULL,
    supp_name VARCHAR(64) NOT NULL,
    recieving_data DATE NOT NULL,
    reciever VARCHAR(128) NOT NULL COLLATE LATIN1_GENERAL_CS,
    state INT(1) NOT NULL,
    FOREIGN KEY (NAME) REFERENCES Item_General_Info(name)
)COLLATE = latin1_general_ci;

方案二:引用父表的主键UID作为外键(更推荐)

通常更合理的做法是用父表的主键作为外键关联,因为主键本身就是唯一且非空的,而且能避免商品名称重复带来的关联混乱:

CREATE TABLE recieving_item(
    item_uid VARCHAR(6) NOT NULL,
    stock INT(11) NOT NULL,
    supp_name VARCHAR(64) NOT NULL,
    recieving_data DATE NOT NULL,
    reciever VARCHAR(128) NOT NULL COLLATE LATIN1_GENERAL_CS,
    state INT(1) NOT NULL,
    FOREIGN KEY (item_uid) REFERENCES Item_General_Info(UID)
)COLLATE = latin1_general_ci;

备注:内容来源于stack exchange,提问作者christopher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 09:18:08