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
相关产品推荐
相关产品推荐

