2012-03-16 99 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

InnoDB允许一个外键引用任何索引列或一组列。但是,在被引用的表中,必须有一个索引,其中被引用的列按照相同顺序列为第一列。

+0

但是我得到一个错误:无法添加或更新子行:外键约束失败('zoneboard'.'work',CONSTRAINT'assignee' FOREIGN KEY('assignee')REFERENCES'user'('id_user')) – harismahesh 2012-03-16 10:51:18

+0

你什么时候得到这个错误?如果您在父项中不匹配的子项中插入值,则会出现此错误。 – 2012-03-16 11:48:12

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

这是真的,但索引应该放在分配上(前提是键是索引),而不是用户表中的用户名! – 2012-03-16 08:46:03

+0

我编辑了我的答案。我错了,谢谢你的警告。 – 2012-03-16 08:54:53

1

您应该参考用户表的主键。整数更快,使用主键而不是无唯一值更安全。想象一下你有两个或更多的用户名相同的行。

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 2012-03-16 10:44:54

+0

但出现错误:无法添加或更新子行:外键约束失败('zoneboard'.'work',CONSTRAINT'assignee' FOREIGN KEY('assignee')REFERENCES'user'('id_user')) – harismahesh 2012-03-16 11:04:22