[英]MySQL: Unable to create a table with Foreign key
我正在嘗試為一個簡單的應用程序學習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語法有錯誤; 在第1行的'SET utf8 DEFAULT NULL,PRIMARY KEY(SLNO),FOREIGN KEY(HANDLEDBY)REFERENCES U'附近檢查與您的MySQL服務器版本相對應的手冊以使用正確的語法
沒有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> 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字符集utf8默認NULL,PRIMARY KEY(SLNO),FOREIGN KEY(HANDLEDBY)參考User_Access(NAME));
錯誤1064(42000):您的SQL語法有錯誤; 請檢查與您的MySQL服務器版本對應的手冊以獲取正確的語法,以在第1行的“ CHARACTER SET utf8 DEFAULT NULL,PRIMARY KEY(SLNO),FOREIGN KEY(HANDLEDBY)RE”附近使用。
是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)
您必須使用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/ zh / create-table-foreign-keys.html
外鍵適用於InnoDB存儲引擎,而不適用於MyISAM。
在User_Access
的NAME
列(外鍵引用的列)上需要定義一個索引(或KEY)。
外鍵列的數據類型必須與引用列的數據類型相同。
規范外鍵模式是在父表中引用PRIMARY KEY; 但您也可以引用任何索引列。 (通常,我們希望它是父表中的UNIQUE KEY,但是MySQL會將其擴展到任何索引,包括非唯一索引。)
最終,我從#mysql的IRC人員那里找到了解決方案。 我在這里提供幫助他人。
他告訴我,無論我要使用什么作為主鍵,還是應該有索引字段。 所以我確實想在表Use_Activity中的NAME字段中添加索引
mysql> alter table User_Access add key(NAME);
Query OK, 0 rows affected (0.30 sec)
Records: 0 Duplicates: 0 Warnings: 0
然后第二次查詢執行正常。
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)字符集latin1不為NULL,主鍵(SLNO),外鍵(HANDLEDBY)參考User_Access(NAME));
Query OK, 0 rows affected (0.21 sec)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.