无法设置外键mysql

时间:2016-12-28 02:30:09

标签: mysql

我正在开发一个补丁版本,它是通过使用原始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创建的。

1 个答案:

答案 0 :(得分:1)

外键列的列数据类型必须与完全引用键列的数据类型匹配。

在这种情况下,预计会报告的行为(错误1005),因为两列的数据类型存在差异。

其中一列是有符号整数,另一列是UNSIGNED整数。

快速修复将更改overtime_scheme_history_id的数据类型,以便签名。 (删除UNSIGNED关键字。)