2016-03-19 3 views
1

Привет, У меня возникли проблемы с созданием базы данных сообщений. Я пытаюсь сделать ключ forenge для ссылки на мою базу данных пользователей. Кто-то может помочь?ERROR 1005 (HY000): Не удается создать таблицу «db.POSTS» (errno: 150)

Вот код для моих таблиц:

CREATE TABLE USERS(

UserID int NOT NULL AUTO_INCREMENT, 
UserName varchar(255), 
UserPassword varchar(255) NOT NULL, 
UserEmailAddress varchar(255) NOT NULL, 
Admin int DEFAULT 0, 
PRIMARY KEY (userID,UserName) 
)ENGINE=InnoDB; 

CREATE TABLE POSTS(

postID int NOT NULL AUTO_INCREMENT, 
postTitle varchar(255) NOT NULL, 
postContent varchar(255) NOT NULL, 
category varchar(255) NOT NULL, 
postDate Date NOT NULL, 
postAuthor varchar(255), 
tag varchar(255), 

PRIMARY KEY(postID), 
FOREIGN KEY(postAuthor) REFERENCES USERS(UserName) 
)ENGINE=InnoDB; 

Вот последнее сообщение об ошибке InnoDB:

Error in foreign key constraint of table db/POSTS: 
FOREIGN KEY(postAuthor) REFERENCES USERS(UserName) 
)ENGINE=InnoDB: 
Cannot find an index in the referenced table where the 
referenced columns appear as the first columns, or column types 
in the table and the referenced table do not match for constraint. 
Note that the internal storage type of ENUM and SET changed in 
tables created with >= InnoDB-4.1.12, and such columns in old tables 
cannot be referenced by such columns in new tables. 
See http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html 
for correct foreign key definition. 

ответ

1

Там действительно не должны быть веские основания, чтобы иметь соединение первичный ключ первой таблицы , Так что, я думаю, что вы намерены:

CREATE TABLE USERS (
    UserID int NOT NULL AUTO_INCREMENT, 
    UserName varchar(255), 
    UserPassword varchar(255) NOT NULL, 
    UserEmailAddress varchar(255) NOT NULL, 
    Admin int DEFAULT 0, 
    PRIMARY KEY (userID), 
    UNIQUE (UserName) 
); 

CREATE TABLE POSTS (
    postID int NOT NULL AUTO_INCREMENT, 
    postTitle varchar(255) NOT NULL, 
    postContent varchar(255) NOT NULL, 
    category varchar(255) NOT NULL, 
    postDate Date NOT NULL, 
    postAuthor int, 
    tag varchar(255), 

    PRIMARY KEY(postID), 
    FOREIGN KEY(postAuthor) REFERENCES USERS(UserId) 
); 

Некоторые примечания:

  • автоинкрементный идентификатор является уникальным на каждой строке. Это хороший первичный ключ.
  • Первичный ключ может состоит из нескольких столбцов (называемых составным первичным ключом). Однако автоинкрементный идентификатор не имеет особого смысла в качестве одного из столбцов. Просто используйте такой идентификатор.
  • Если вы используете составной первичный ключ, то ссылки на внешние ключи должны содержать все столбцы.
  • Я выбрал UserId для ссылки на внешний ключ. Вы также можете использовать UserName (потому что он уникален).
  • UserName - плохой выбор для внешних ключей, потому что - возможно, пользователь может изменить свое имя.
1

Ошибка вызвана неправильным определением внешнего ключа. В конкретном случае вам не хватает полного столбца в определении внешнего ключа.

В таблице USERS вы определили первичный ключ как составной ключ UserID и UserName столбцов.

CREATE TABLE USERS (
    UserID int NOT NULL AUTO_INCREMENT, 
    UserName varchar(255), 
    UserPassword varchar(255) NOT NULL, 
    UserEmailAddress varchar(255) NOT NULL, 
    Admin int DEFAULT 0, 
    PRIMARY KEY (UserID,UserName) 
) ENGINE=InnoDB; 

отмечает, что это хорошая практика, уважать случай идентификаторов (имена столбцов)

В POSTS таблицы вы объявили свой внешний ключ для ссылки только один столбца в USERS таблицы, UserName колонка. Это неверно, так как вам нужно указать весь первичный ключ таблицы USERS, который равен (UserID, UserName). Таким образом, чтобы исправить ошибку, вам нужно добавить еще один столбец в POSTS таблицы и изменить определение внешнего ключа, как это:

CREATE TABLE POSTS(
    postID int NOT NULL AUTO_INCREMENT, 
    postTitle varchar(255) NOT NULL, 
    postContent varchar(255) NOT NULL, 
    category varchar(255) NOT NULL, 
    postDate Date NOT NULL, 

    authorId int, 
    postAuthor varchar(255), 

    tag varchar(255), 
    PRIMARY KEY(postID), 
    FOREIGN KEY(authorId, postAuthor) REFERENCES USERS(UserID, UserName) 
) ENGINE=InnoDB; 

Пожалуйста, смотрите на следующую скрипке: http://sqlfiddle.com/#!9/92ff1/1

ПРИМЕЧАНИЯ: Если вы можете вы должны перепроектировать это, чтобы не использовать составной первичный ключ в таблице USERS, так как это не имеет смысла из того, что я вижу в отображаемом коде. Вы можете изменить таблицы следующим образом:

CREATE TABLE USERS (
    UserID int NOT NULL AUTO_INCREMENT, 
    UserName varchar(255), 
    UserPassword varchar(255) NOT NULL, 
    UserEmailAddress varchar(255) NOT NULL, 
    Admin int DEFAULT 0, 
    PRIMARY KEY (UserID) 
) ENGINE=InnoDB; 

CREATE TABLE POSTS (
    postID int NOT NULL AUTO_INCREMENT, 
    postTitle varchar(255) NOT NULL, 
    postContent varchar(255) NOT NULL, 
    category varchar(255) NOT NULL, 
    postDate Date NOT NULL, 

    postAuthorID int, 

    tag varchar(255), 
    PRIMARY KEY(postID), 
    FOREIGN KEY(postAuthorID) REFERENCES USERS(UserID) 
) ENGINE=InnoDB;;