我正在尝试为一个简单的应用程序学习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)
答案 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)