2012-07-01 2 views
0

Вот мой SQL скриптНе удается создать таблицу <tablename> ERRNO 150

CREATE TABLE tracks(
track_id int NOT NULL AUTO_INCREMENT, 
account_id int, 
track_name varchar(255), 
track_path varchar(255), 
track_art_path varchar(255), 
track_desc text, 
primary key(track_id), 
FOREIGN KEY (account_id) REFERENCES accounts_profile(accnt_id) 
) 

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

#1005 - Can't create table 'beatbeast.tracks' (errno: 150) 

Это не показывает, в какой строке находится ошибка.

+0

0-й вопрос: является ли стол' accounts_profile' существует? Являются ли точные типы 'tracks.account_id' такими же, как' account_profile.accnt_id'? – biziclop

+2

Также вы можете опубликовать структуру 'accounts_profile'. Если типы данных 'account_id' и' account_profile.accnt_id' не совпадают (например, одно не указано), FK завершится с ошибкой 150. –

+0

accounts_profile существует в моей базе данных. – user962206

ответ

2

Errno 150, как правило, является результатом несоответствия между точными типами данных столбца с ссылкой на основную таблицу и ссылочным столбцом. В вашем случае tracks.account_id является подписанным INT, но столбец, на который он ссылается accounts_profile.accnt_id, - INT UNSIGNED. Таким образом, вы должны создать таблицу с помощью tracksINT UNSIGNED для account_id, а также:

CREATE TABLE tracks(
    track_id int NOT NULL AUTO_INCREMENT, 
    account_id int UNSIGNED, 
    track_name varchar(255), 
    track_path varchar(255), 
    track_art_path varchar(255), 
    track_desc text, 
    primary key(track_id), 
    FOREIGN KEY (account_id) REFERENCES accounts_profile(accnt_id) 
) 
2

От the documentation:

Если MySQL сообщает номер ошибки 1005 из CREATE заявление TABLE, и сообщение об ошибке относится к ошибке 150, создание таблиц не удалось , так как ограничение внешнего ключа не был правильно сформирован.

Проверьте, соответствует ли тип данных accounts_profile.accnt_idtracks.account_id. В настоящее время один является int, поэтому другой должен также быть int.

Furhter, документация предлагает следующее:

SHOW ENGINE INNODB STATUS 

после получения сообщения об ошибке для более подробного объяснения.