通过PHP单次创建customer_data与order_data表外键150错误如何解决
问题解决方法
错误原因
这个报错核心是外键字段与被引用的主键字段属性不匹配:customers_data表的主键id定义为int(20) UNSIGNED(无符号整数类型),但order_data表中用于关联的cus_id字段定义为int(20)(普通有符号整数类型),二者属性不一致,导致外键约束无法创建。
修复方案
修改order_data表的cus_id字段属性,和被引用的customers_data.id保持完全一致,增加UNSIGNED属性即可。
修正后的order_data建表语句
CREATE TABLE IF NOT EXISTS order_data ( id int(20) UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, cus_id int(20) UNSIGNED NOT NULL, ITEM varchar(255) NOT NULL, HSN varchar(50) NOT NULL, QTY int(15) NOT NULL, RATE decimal(40,2) NOT NULL, S_C_GST decimal(30,2) NOT NULL, TOTAL decimal(50,2) NOT NULL, _DATE timestamp NOT NULL DEFAULT current_timestamp(), FOREIGN KEY(cus_id) REFERENCES customers_data(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
PHP单次执行多SQL注意事项
- 确保建表顺序为先创建
customers_data,再创建order_data,依赖表必须先存在才能创建外键约束 - 若使用mysqli扩展执行多段SQL,需要调用
mysqli_multi_query()方法,不能用普通的mysqli_query() - 若使用PDO扩展执行多段SQL,需要在连接配置中开启
PDO::MYSQL_ATTR_MULTI_STATEMENTS参数
其他排查点(若修改类型后仍报错可检查)
- 两张表的存储引擎必须都为InnoDB,MyISAM不支持外键
- 两张表的字符集、排序规则必须一致
- 被引用的
customers_data.id必须是主键或唯一索引,当前配置已满足要求
内容的提问来源于stack exchange,提问作者it's my world
相关产品推荐
相关产品推荐

