2015-06-22 85 views
0

我試圖插入僞數據到我的數據庫去,並在一個特定的表中我有兩列是FK和PK的表; fk_product_manf_code和fk_content_id。據我的理解,這些被視爲目前狀態下的複合鍵。複合鍵1欄中的重複輸入錯誤

所以我將數據添加到表:

fk_product_manf_code  fk_content_id 
NOV-ABC123    1 

然後,我想其他的content_id相同的product_manf_code關聯,所以我執行以下操作:

INSERT INTO `mydb`.`package_contents` 
(`fk_product_manf_code`, `fk_content_id`) 
VALUES 
('NOV-ABC123', 2); 

但是我與打招呼出現以下錯誤:

Error Code: 1062. Duplicate entry 'NOV-ABC123' for key 'fk_product_manf_code_UNIQUE' 

我不明白髮生了什麼,因爲我以爲是複合e鍵使2列獨一無二?那麼爲什麼它只是一個小題大做,只有一列是獨一無二的?

下面是表CREATE語句

CREATE TABLE `package_contents` (
    `fk_product_manf_code` varchar(255) NOT NULL, 
    `fk_content_id` int(11) NOT NULL, 
    PRIMARY KEY (`fk_content_id`,`fk_product_manf_code`), 
    UNIQUE KEY `fk_content_id_UNIQUE` (`fk_content_id`), 
    UNIQUE KEY `fk_product_manf_code_UNIQUE` (`fk_product_manf_code`), 
    CONSTRAINT `content_id` FOREIGN KEY (`fk_content_id`) REFERENCES `contents` (`content_id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `product_manf_code` FOREIGN KEY (`fk_product_manf_code`) REFERENCES `products` (`product_manf_code`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
+0

主鍵是確實的複合,但你還定義在單個列唯一約束('UNIQUE KEY ...')。 – Marvin

+0

最近我發現這是一個冗餘配置,但是在試圖除去這兩列的唯一索引,MySQL工作臺使我有以下錯誤:'錯誤1553:不能刪除索引「fk_product_manf_code_UNIQUE」:需要一個外鍵constraint' – adampski

回答

1

所以,你正在學習,爲什麼複合主鍵是一個痛苦,特別是對於外鍵約束。整數鍵不僅更有效,而且單鍵更易於使用。

我建議改變你的表結構更是這樣的:

CREATE TABLE package_contents (
    package_contents_id int not null auto_increment primary key, 
    fk_product_manf_id int NOT NULL, 
    fk_content_id int(11) NOT NULL, 
    UNIQUE KEY (fk_content_id, fk_product_manf_id), 
    CONSTRAINT content_id FOREIGN KEY (fk_content_id) 
     REFERENCES contents(content_id) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT product_manf_code FOREIGN KEY (fk_product_manf_id) 
     REFERENCES products(product_manf_id) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

注意,我改變了製造商代碼到id爲好。假設「代碼」長於4個字節,這也應該減小表的大小。

如果你這樣做了所有的表,數據庫會有點更高效,您將不再需要多餘的unique約束。外鍵約束應始終是主鍵(除非使用不同的唯一鍵有很好的理由)。