簡體   English   中英

MySQL:無法使用外鍵創建表

[英]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_AccessNAME列(外鍵引用的列)上需要定義一個索引(或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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM