2015-02-15 1 views
1

Я не уверен, почему у меня всегда возникают проблемы с FOREIGN KEYs, но у меня есть еще один.Ошибка 150 при добавлении FOREIGN KEY в таблицу MySQL

Когда я бегу:

ALTER TABLE wishlist ADD CONSTRAINT FOREIGN KEY (user_id) REFERENCES user (user_id); 

я получаю:

Can't create table (errno: 150) 

Обе таблицы существует. Оба столбца существуют, и оба они одинаковы - bigint (20). user.user_id - первичный ключ, но wishlist.user_id - нет. Оба NOT NULL

Вот начало пользовательской таблицы (я усеченный его легко читать):

+-----------------+------------------------------+------+-----+-------------------+----------------+ 
| Field   | Type       | Null | Key | Default   | Extra   | 
+-----------------+------------------------------+------+-----+-------------------+----------------+ 
| user_id   | bigint(20)     | NO | PRI | NULL    | auto_increment | 
| salt2   | varchar(24)     | YES |  | NULL    |    | 
| gender   | enum('MAN','WOMAN','EITHER') | NO |  | NULL    |    | 
| user_name  | varchar(255)     | NO |  | NULL    |    | 
| password  | varchar(255)     | NO |  | NULL    |    | 
| user_email  | varchar(255)     | NO |  | NULL    |    | 
| phone   | varchar(20)     | NO |  | NULL    |    | 

И в wishlist стол:

+-----------+------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+-----------+------------+------+-----+---------+----------------+ 
| wish_id | int(11) | NO | PRI | NULL | auto_increment | 
| link_hash | char(32) | YES | MUL | NULL |    | 
| user_id | bigint(20) | NO |  | NULL |    | 
+-----------+------------+------+-----+---------+----------------+ 

Я не создаю таблицу который был сброшен.

+0

Можете ли вы показать определения таблиц? – Mihai

+0

Вы воссоздаете таблицу, которая была удалена? – Mureinik

ответ

1

Если вы используете InnoDB, столбец user_id должен иметь тип «ключ» или «первичный ключ», а не тип bigint. Этот конкретный движок не любит создавать ограничения FK для не-ключевых элементов.

CREATE TABLE 'user' (
KEY 'user_id' ('user_id') 
[... your columns here] 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Кроме того, убедитесь, что оба устройства используют один и тот же движок и кодировку, иначе он все равно будет работать.

+0

должен быть уникальным или первичным, просто индекс не разрежет его. – Mihai

+0

Очень интересно - но как узнать, пользуюсь ли я InnoDB? Или, возможно, более непосредственно, как мне изменить текущую таблицу для 'user_id' типа PRIMARY KEY? – ice13berg

+1

SHOW TABLE STATUS WHERE Name = 'user', чтобы найти движок и пользователь ALTER TABLE ADD PRIMARY KEY (user_id), чтобы преобразовать существующий столбец. Убедитесь, что у вас есть резервные копии в первую очередь! –

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