我正在开发一个补丁版本,它是通过使用原始sql创建或更新现有表。当我运行这些3个查询时,如下所示
首先查询成功
CREATE TABLE ts_overtime_scheme_histories( id int AUTO_INCREMENT NOT NULL,
name VARCHAR(255),
workdays INT,
break_payable VARCHAR(25),
roundable VARCHAR(25),
round_rule VARCHAR(10), round_minute INT,
type enum('ratio','fixed') DEFAULT 'ratio',
overtime_request_id INT UNSIGNED NOT NULL, PRIMARY KEY(id),
FOREIGN KEY(overtime_request_id) REFERENCES ts_overtime_requests(id) );
第二次查询成功
CREATE TABLE ts_overtime_scheme_details_histories( id INT AUTO_INCREMENT NOT NULL,
hour FLOAT,
ratio FLOAT,
overtime_scheme_history_id INT(11) UNSIGNED NOT NULL,
PRIMARY KEY(id));
现在我正在尝试将第二个表连接到第一个表。所以第一个表在第二个表上有外键。所以我运行了第三个查询
ALTER TABLE ts_overtime_scheme_details_histories ADD FOREIGN KEY (`overtime_scheme_history_id`) REFERENCES `ts_overtime_scheme_histories` (`id`) ON DELETE CASCADE;
但不知怎的,它失败了。错误报告在
之下General error: 1005 Can't create table `db_test`.`#sql-ea4_28` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: ALTER TABLE ts_overtime_scheme_details_histories
ADD FOREIGN KEY (`overtime_scheme_history_id`) REFERENCES `ts_overtime_scheme_histories` (`id`)
ON DELETE CASCADE;)
有人可以帮我找到我想念的东西吗?起初,我怀疑主键和外键数据长度不相似,但是当我仔细检查时,它是正确的。
编辑: table ts_overtime_requests 是使用laravel framework创建的。
答案 0 :(得分:1)
外键列的列数据类型必须与完全引用键列的数据类型匹配。
在这种情况下,预计会报告的行为(错误1005),因为两列的数据类型存在差异。
其中一列是有符号整数,另一列是UNSIGNED
整数。
快速修复将更改overtime_scheme_history_id
的数据类型,以便签名。 (删除UNSIGNED
关键字。)