2016-12-28 5 views
1

Я разрабатывает версию патча, который с помощью создания или обновления существующей таблицы с помощью сырой sql.When я выбежала эти 3 запросы, как нижеудалось установить внешний ключ MySQL

первый запрос Success

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;) 

Может ли кто-нибудь помочь мне найти то, что я пропустил? Сначала я подозреваю, что длина данных первичного и внешнего ключей не похожа, но когда я дважды проверял, это правильно.

Редактировать: ts_overtime_requests был создан с использованием рамки laravel.

ответ

1

Тип столбца столбца внешнего ключа должен соответствовать точно тип данных ссылочной колонки ключей.

В этом случае ожидается сообщение о поведении (ошибка 1005), поскольку существует разница в типах данных этих двух столбцов.

Один из столбцов имеет целое число со знаком, другой столбец UNSIGNED integer.

Быстрое исправление будет заключаться в изменении типа данных overtime_scheme_history_id так, чтобы он был подписан. (Удалите ключевое слово UNSIGNED.)