MySQL:无法使用外键创建表

时间:2014-04-09 18:21:51

标签: mysql foreign-keys

我正在尝试为一个简单的应用程序学习MySQL。当我尝试使用外键创建表时,我收到以下错误。

mysql> create table User_Activity (SLNO INT NOT NULL AUTO_INCREMENT, 
DATEOFTASK TIMESTAMP default NOW(), 
TASKNAME VARCHAR(30) NOT NULL, 
TASKACTION VARCHAR(30) NOT NULL, 
BACKUP VARCHAR(5) NOT NULL, 
TASKSTATUS VARCHAR(15) NOT NULL, 
HANDLEDBY VARCHAR(30) NOT NULL SET utf8 DEFAULT NULL ,
 PRIMARY KEY (SLNO), 
FOREIGN KEY (HANDLEDBY) REFERENCES User_Access(NAME));

错误是(即使没有SET utf8 DEFAULT NULL我收到错误)

  

错误1064(42000):您的SQL语法有错误;检查   手册,对应右边的MySQL服务器版本   语法使用' SET utf8 DEFAULT NULL,PRIMARY KEY(SLNO),   外键(HANDLEDBY)参考文献U'在第1行

没有SET utf8 DEFAULT NULL的错误:

mysql> create table User_Activity (SLNO INT NOT NULL AUTO_INCREMENT,
DATEOFTASK TIMESTAMP default NOW(), 
TASKNAME VARCHAR(30) NOT NULL,
TASKACTION VARCHAR(30) NOT NULL,
 BACKUP VARCHAR(5) NOT NULL,
TASKSTATUS VARCHAR(15) NOT NULL, 
HANDLEDBY VARCHAR(30), 
PRIMARY KEY (SLNO), FOREIGN KEY (HANDLEDBY) REFERENCES User_Access(NAME));

ERROR 1005 (HY000): Can't create table 'activity.User_Activity' (errno: 150)

User_Access表的描述是,

mysql> DESC User_Access;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| SLNO        | int(11)     | NO   | PRI | NULL    | auto_increment |
| NAME        | varchar(30) | NO   |     | NULL    |                |
| PASSWORD    | varchar(30) | NO   |     | NULL    |                |
| DESIGNATION | varchar(30) | NO   |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+
4 rows in set (0.07 sec)

编辑1:

  

的MySQL>创建表User_Activity(SLNO INT NOT NULL AUTO_INCREMENT,   DATEOFTASK TIMESTAMP默认NOW(),TASKNAME VARCHAR(30)NOT NULL,   TASKACTION VARCHAR(30)NOT NULL,BACKUP VARCHAR(5)NOT NULL,   TASKSTATUS VARCHAR(15)NOT NULL,HANDLEDBY VARCHAR(30)NOT NULL   CHARACTER SET utf8 DEFAULT NULL,PRIMARY KEY(SLNO),FOREIGN KEY   (HANDLEDBY)参考User_Access(NAME));

     

ERROR 1064(42000):你   您的SQL语法有错误;检查对应的手册   您的MySQL服务器版本,以便在“CHARACTER”附近使用正确的语法   SET utf8 DEFAULT NULL,PRIMARY KEY(SLNO),FOREIGN KEY(HANDLEDBY)   RE'在第1行mysql>

是User_Access表只是Inno_DB,这是输出

mysql> SHOW CREATE TABLE User_Access;
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table       | Create Table                                                                                                                                                                                                                                                  |
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| User_Access | CREATE TABLE `User_Access` (
  `SLNO` int(11) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(30) NOT NULL,
  `PASSWORD` varchar(30) NOT NULL,
  `DESIGNATION` varchar(30) NOT NULL,
  PRIMARY KEY (`SLNO`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 |
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)

3 个答案:

答案 0 :(得分:0)

您必须使用CHARACTER SET而非SET

编辑:另一个重要的语法要求是CHARACTER SET utf8语法必须在NOT NULL之前。

...
HANDLEDBY VARCHAR(30) CHARACTER SET utf8 NOT NULL, /* can't use NULL as default */
...

如果列的字符集与引用的列User_acces(NAME)的字符集相同,则外键将起作用。

还必须满足其他要求,例如引用的列必须在键中,表必须是InnoDB等。请在此处查看完整的条件列表:https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

答案 1 :(得分:0)

外键适用于InnoDB存储引擎,而不适用于MyISAM。

需要在NAME中的User_Access列(外键引用的列)中定义索引(或KEY)。

外键列的数据类型必须与引用列的数据类型相同。

规范外键模式是引用父表中的PRIMARY KEY;但您也可以引用任何索引列。 (通常,我们希望它在父表中是一个独特的键,但是MySQL将它扩展到任何索引,包括非唯一索引。)

答案 2 :(得分:0)

最后来自#mysql的IRC人员,我找到了解决方案。我在这里帮助别人。

他告诉我,我要为主键采取什么,或者它应该有索引字段。所以我喜欢在表Use_Activity with

中添加索引到NAME字段
mysql> alter table User_Access add key(NAME);
Query OK, 0 rows affected (0.30 sec)
Records: 0  Duplicates: 0  Warnings: 0

然后第二个查询执行得很好。

  

的MySQL>创建表User_Activity(SLNO INT NOT NULL AUTO_INCREMENT,   DATEOFTASK TIMESTAMP默认NOW(),TASKNAME VARCHAR(30)NOT NULL,   TASKACTION VARCHAR(30)NOT NULL,BACKUP VARCHAR(5)NOT NULL,   TASKSTATUS VARCHAR(15)NOT NULL,HANDLEDBY VARCHAR(30)CHARACTER SET   latin1 NOT NULL,PRIMARY KEY(SLNO),FOREIGN KEY(HANDLEDBY)   参考User_Access(NAME));

Query OK, 0 rows affected (0.21 sec)