2012-03-16 2 views
0

Я выполнил следующий запрос в командной строке MySQL и создал таблицы. Но когда я побежал в XAMPP, я получил ошибку "1005 - Не удается создать таблицу 'zoneboard.work' (ошибка: 150)"MySQL: можно создать таблицу через командную строку MySQL, но не удалось создать с помощью XAMPP

Мой запрос:

Create Table user (
    id_user INT (50)NOT NULL AUTO_INCREMENT , 
    email VARCHAR(64) NOT NULL , 
    username VARCHAR(16) NOT NULL , 
    password VARCHAR(32) NOT NULL , 
    PRIMARY KEY (id_user) 
) ENGINE = InnoDB 

CREATE TABLE work (
    id_user INT(50) NOT NULL AUTO_INCREMENT , 
    task VARCHAR(50) NOT NULL , 
    comments VARCHAR(100) NOT NULL , 
    assignee VARCHAR(16) NOT NULL , 
    priority VARCHAR(50) NOT NULL , 
    status VARCHAR(50) NOT NULL , 
    dataum1 VARCHAR(50) NOT NULL , 
    dataum2 VARCHAR(50) NOT NULL , 
    PRIMARY KEY (id_user), 
    FOREIGN KEY(assignee) REFERENCES user(username) 
) ENGINE = InnoDB 

ответ

0
CREATE TABLE USER (
    id_user INT (50)NOT NULL AUTO_INCREMENT , 
    email VARCHAR(64) NOT NULL , 
    username VARCHAR(16) NOT NULL , 
    PASSWORD VARCHAR(32) NOT NULL , 
    PRIMARY KEY (id_user, username), 
    INDEX(username) 
) ENGINE = INNODB; 

Родительский стол-пользователь должен иметь индексный столбец (здесь имя пользователя должно быть проиндексировано). См: http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

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

+0

Но у меня есть ошибка: невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется ('zoneboard'.'work', CONSTRAINT' assignee' FOREIGN KEY ('assignee') ССЫЛКИ' user' ('id_user')) – harismahesh

+0

Когда вы получили эту ошибку? Если вы являетесь INSERTING значениями в дочернем, которые не совпадают в родительском, то вы получаете эту ошибку. –

1

Согласно MySQL документации: If you are creating a table, it must have the right column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns error number 1005 and refers to error 150 in the error message.

Поэтому, попробуйте добавить индекс на вашем ссылочное поле username как:

CREATE INDEX username_index ON 'user'(username) 
+0

Это правда, но индекс должен быть помещен не на assigne (forkey key IS является индексом), а на имя пользователя в пользовательской таблице! –

+0

Я отредактировал свой ответ. Я ошибся, спасибо за ваше предупреждение. –

1

Вы должны обратиться к первичному ключу таблицы пользователя. Целое число быстрее, и более безопасно использовать первичный ключ вместо уникального значения. Представьте, что у вас есть 2 или более строк с одинаковым именем пользователя.

CREATE TABLE `work` (
    `id_user` int(50) NOT NULL AUTO_INCREMENT, 
    `task` varchar(50) NOT NULL, 
    `comments` varchar(100) NOT NULL, 
    `assignee` int(50) NOT NULL, 
    `priority` varchar(50) NOT NULL, 
    `status` varchar(50) NOT NULL, 
    `dataum1` varchar(50) NOT NULL, 
    `dataum2` varchar(50) NOT NULL, 
    PRIMARY KEY (`id_user`), 
    KEY `assignee` (`assignee`), 
    CONSTRAINT `assignee` FOREIGN KEY (`assignee`) REFERENCES `user` (`id_user`) 
) ENGINE=InnoDB; 
+0

Спасибо за обмен. Я попробовал это. – harismahesh

+0

Но получена ошибка: не удается добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется ('zoneboard'.'work', CONSTRAINT' assignee' FOREIGN KEY ('assignee') ССЫЛКИ' user' ('id_user')) – harismahesh

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