2013-01-11 61 views
0

我知道這個問題發佈了很多,我仔細檢查了我的代碼,但無法找到爲什麼當我使用Foreign Key創建表時,mysql給了我一個錯誤。無法在mysql中使用外鍵創建表

mysql> CREATE TABLE Act_Model(
    -> code VARCHAR(8) NOT NULL, 
    -> model VARCHAR(64) NOT NULL, 
    -> PRIMARY KEY (code))ENGINE = INNODB; 
Query OK, 0 rows affected (0.09 sec) 
mysql> CREATE TABLE IBT_ActItem(
    -> model VARCHAR(64) NOT NULL, 
    -> flagbit BIGINT(20) UNSIGNED NOT NULL DEFAULT '0', 
    -> PRIMARY KEY(model), 
    -> FOREIGN KEY(model) REFERENCES Act_Model(model))ENGINE = INNODB; 
ERROR 1005 (HY000): Can't create table 'test.ibt_actitem' (errno: 150) 
mysql> CREATE TABLE IBT_ActItem(
    -> model VARCHAR(64) NOT NULL, 
    -> flagbit BIGINT(20) UNSIGNED NOT NULL DEFAULT '0', 
    -> PRIMARY KEY(model))ENGINE = INNODB; 
Query OK, 0 rows affected (0.09 sec) 

當我用show engins;,InnoDB的它給我:

| InnoDB    | DEFAULT | Supports transactions, row-level locking, and foreign keys  | YES   | YES | YES  | 

你能幫我找到哪裏是我的錯?由於

+0

嘗試創建表格首先,然後添加外鍵。 – Kermit

+0

你應該在設置fk之前製作pk。 –

+0

你確定你想要這樣嗎?對我來說看起來有點奇怪。 –

回答

4

您需要在父表上的模型列上添加唯一索引:

CREATE TABLE Act_Model(
code VARCHAR(8) NOT NULL, 
model VARCHAR(64) NOT NULL, 
PRIMARY KEY (code), 
UNIQUE KEY model (model) 
)ENGINE = INNODB; 
+0

@ Ike Walker:你是對的! – HuongOrchid

+0

注意:這將強制執行這兩個表之間的「一對零或一」關係。 – spencer7593

0

MySQL的要求,你必須在列(或多個)唯一的密鑰或PRIMARY KEY約束是目標的FOREIGN KEY約束。

要添加的唯一密鑰,您可以使用此語法:

ALTER TABLE Act_Model ADD CONSTRAINT Act_Model_UX UNIQUE KEY (model) ; 

您已經定義爲IBT_ActItem表的主鍵的model列。

如果添加一個UNIQUE KEY約束以及其他表(Act_Model)的modelFOREIGN KEY約束,實際上是指定一個「一比一(可選)」這兩個表之間的關係。

UNIQUE(或PRIMARY)KEY放在父表上,這是「一對多」關係的「一個」方面。 FOREIGN KEY進入子表,這是關係的「零個,一個或多個」方面。


(規範性的做法是有一個外鍵引用目標表的主鍵使model列,而不是code列,主鍵:

ALTER TABLE Act_Model DROP PRIMARY KEY ; 
ALTER TABLE Act_Model ADD PRIMARY KEY (model) ; 

注意:UNIQUE KEY和PRIMARY KEY之間有一些明顯的區別,例如,在一個表上只能定義一個PRIMARY KEY,並且PRIMARY KEY約束對列執行NOT NULL約束。)