SQL Fiddle无法添加外键约束:salesorderslineitem表构建问题求助
Hey,我来帮你排查这个salesorderslineitem表创建时的外键错误问题~ 遇到cannot add foreign key constraint这种报错,大多是外键关联的两端不匹配,或者依赖的资源没准备好。结合你给出的salesorders表结构,我整理了几个核心排查方向:
1. 补全不完整的外键引用语法
你给出的salesorders表中,customer_id的外键写了REFERENCES customers...,这明显没写完呀!得确保引用的表和字段都明确,比如如果customers表的主键是customer_id,那完整写法应该是:
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
而且要保证customers表已经在salesorders之前创建好了,不然数据库找不到依赖的表也会报错。
2. 外键字段和父表主键必须完全匹配
假设你要让salesorderslineitem关联salesorders的donut_order_id,那salesorderslineitem里对应的外键字段必须和父表的donut_order_id类型完全一致:
- 父表是
INT(10) NOT NULL,那子表的外键字段也得是INT(10) NOT NULL,不能是INT不带长度,也不能允许为NULL - 给你一个
salesorderslineitem的正确创建示例参考:
CREATE TABLE salesorderslineitem ( line_item_id INT(10) NOT NULL AUTO_INCREMENT, donut_order_id INT(10) NOT NULL, -- 类型和父表完全对齐 donut_id INT(10), quantity INT, unit_price DECIMAL(10,2), PRIMARY KEY (line_item_id), FOREIGN KEY (donut_order_id) REFERENCES salesorders(donut_order_id), -- 如果还有其他外键,比如关联甜甜圈表,也要保证语法和类型正确 FOREIGN KEY (donut_id) REFERENCES donuts(donut_id) );
3. 检查SQL的执行顺序
在SQL Fiddle里创建表的时候,一定要先建被依赖的表,比如先建customers,再建salesorders,最后才建salesorderslineitem。如果顺序搞反了,数据库还没创建父表,自然没法给子表加外键约束。
4. 查看更详细的错误日志
如果上面几点都排查过还是不行,你可以看看SQL Fiddle里的详细错误提示(一般报错信息下面会有errno: 150之类的代码,对应的具体原因),比如是字段类型不匹配,还是父表不存在,或者父表没有主键,这些细节能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者warhammer

