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