2016-09-21 2 views
0

В моей базе данных MySQL У меня есть две таблицы:SQL ошибка при добавлении ссылки

CREATE TABLE orders (
id BIGINT AUTO_INCREMENT, 
user_id BIGINT DEFAULT 1 NOT NULL, 
price DECIMAL(18, 2) NOT NULL, 
name VARCHAR(255) NOT NULL, 
surname VARCHAR(255) NOT NULL, 
[...] 
is_fulfilled TINYINT(1) DEFAULT '0' NOT NULL, 
INDEX user_id_idx (user_id), 
PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = INNODB; 

и

CREATE TABLE user (
id INT AUTO_INCREMENT, 
username VARCHAR(128) NOT NULL UNIQUE, 
email VARCHAR(128) NOT NULL UNIQUE, 
[...] 
INDEX name_idx_idx (username), 
PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = INNODB; 

Когда я пытаюсь установить отношения

ALTER TABLE orders ADD CONSTRAINT orders_user_id_user_id FOREIGN KEY (user_id) REFERENCES user(id); 

я получаю это погрешность

#1005 - Can't create table 'druk.#sql-b38_173' (errno: 150) 

Есть ли что-то не так в этих таблицах или что?

+3

Этот вопрос был дан ранее здесь; [ссылка для ответа на errno 150] (http://stackoverflow.com/questions/4061293/mysql-cant-create-table-errno-150) и здесь; (http://stackoverflow.com/questions/1457305/mysql-creating-tables-with-foreign-keys-giving-errno-150) – Intern87

ответ

0

Это действительно странная ошибка, которая не кажется связанной с вашими таблицами в их текущей форме. Следовательно, вам нужно правильно воссоздать таблицы.

Однако у вас есть проблема. Столбец orders.user_id имеет тип, который не соответствует типу user.id. Вы должны изменить его на:

user_id INT DEFAULT 1 NOT NULL, 

Here является SQL Fidde.

Я должен добавить, что значение по умолчанию для «1» кажется странным.

+0

Ошибка связана с таблицами, говорит ошибка 1005; Если вы заново создали таблицу, которая была удалена, она должна иметь определение, соответствующее ограничениям внешнего ключа, ссылающимся на него. Он должен иметь правильные имена столбцов и ** типы **, и он должен иметь индексы на ссылочных ключах, как указано ранее. Если они не выполняются, MySQL возвращает ошибку 1005 и ссылается на Error 150 в сообщении об ошибке, что означает, что ограничение внешнего ключа было неправильно сформировано. Внешние типы ключей должны быть одинаковыми для таблицы, заменяющей его. – Intern87

+0

@ Intern87. , , Я был неясно в ответе. Я хотел указать, что код имеет другую ошибку. –

+0

Thx, проблема была в разных типах. – Rodgard

0

Просто убедитесь, что оба поля соответствуют типу. Либо изменить orders.user_id на INT, либо user.id на BIGINT. Кажется более разумным заменить orders.user_id на INT, если вы не ожидаете миллионов пользователей ...

Смежные вопросы