2013-06-02 304 views
1

我有一個複合主鍵的MySQL表。MySQL複合主鍵重複

CREATE TABLE `courses` (
`termNum` varchar(6) NOT NULL COMMENT 'Term Number', 
`classNum` smallint(6) NOT NULL, 
`subject` varchar(3) NOT NULL, 
`courseNum` varchar(9) NOT NULL, 
`classTitle` varchar(75) NOT NULL, 
`numUnits` varchar(10) NOT NULL, 
`dates` varchar(50) NOT NULL, 
`startTime` varchar(50) NOT NULL, 
`endTime` varchar(50) NOT NULL, 
`location` varchar(50) NOT NULL, 
`generalStudies` varchar(22) NOT NULL, 
`instructor` varchar(50) NOT NULL DEFAULT 'Staff', 
`seatsOpen` int(11) NOT NULL DEFAULT '0', 
`dayList` varchar(50) NOT NULL, 
`miss` tinyint(4) NOT NULL DEFAULT '0', 
PRIMARY KEY (`classNum`,`termNum`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

本來我只打算用classNum作爲主鍵,但事實證明,跨越方面,它實際上可能重複。爲了避免問題,我希望將classNumtermNum一起組合到主鍵中。原來我的查詢添加數據是這樣的:

INSERT INTO `courses` (`termNum`,`classNum`,`courseNum`,`subject`,`generalStudies`,`classTitle`,`numUnits`,`dates`,`dayList`,`startTime`,`endTime`,`location`,`instructor`,`seatsOpen`,`miss`) 
VALUES ('2136','74581','101','ACC','','Accounting','3','10/21 - 12/13(C)','M W Th','6:00 PM','10:00 PM',' TBA','The Professor','50','0') 
ON DUPLICATE KEY 
UPDATE `courseNum` = '101',`subject` = 'ACC',`generalStudies` = '',`classTitle` = 'Accounting',`numUnits` = '3',`dates` = '10/21 - 12/13(C)',`dayList` = 'M W Th',`startTime` = '6:00 PM',`endTime` = '10:00 PM',`location` = 'TBA',`instructor` = 'The Professor',`seatsOpen` = '50',`miss` = '0'; 

但是,在少數運行後,我注意到它只是更新同一行。所以,我想這一點:

INSERT INTO `courses` (`termNum`,`classNum`,`courseNum`,`subject`,`generalStudies`,`classTitle`,`numUnits`,`dates`,`dayList`,`startTime`,`endTime`,`location`,`instructor`,`seatsOpen`,`miss`) 
VALUES ('2137','74580','101','ACC','','Accounting','3','10/21 - 12/13(C)','M W Th','6:00 PM','10:00 PM','Tempe - TBA','The Professor','50','0'); 
INSERT INTO `courses` (`termNum`,`classNum`,`courseNum`,`subject`,`generalStudies`,`classTitle`,`numUnits`,`dates`,`dayList`,`startTime`,`endTime`,`location`,`instructor`,`seatsOpen`,`miss`) 
VALUES ('2137','90000','101','ACC','','Accounting','3','10/21 - 12/13(C)','M W Th','6:00 PM','10:00 PM','Tempe - TBA','The Professor','50','0'); 

我也得到:

#1062 - Duplicate entry '32767-2137' for key 'PRIMARY' 

注意,我改變了classNum但不是termNum,所以顯然它不使用整個主鍵。但是真正讓我困惑的是,如果我改變termNum並且保持classNum一樣,那麼它可以完美地工作。我試過在PRIMARY KEY()行中切換字段的順序,但它是一樣的。

我搜索了四周,似乎沒有任何明顯的錯誤。我嘗試重建表格,但沒有改變。

回答

4

您在classNum上插入的值爲74581,但將插入的實際值爲32767

原因是因爲您正在使用smallint(6)數據類型的列classNum其最大值爲32767。嘗試更改可以容納更大範圍的數字的數據類型,例如。 INT UNSIGNED

classNum INT UNSIGNED NOT NULL, 

有關數值數據類型範圍的詳細信息,請參見下面

+0

的鏈接時,該工作完全,謝謝。我通常只使用INT,但我試圖保持這個數據庫很小。當我查看文件時,出於某種原因,我的頭腦裏說價值是成千上萬,而不是成千上萬,所以我認爲smallint沒問題。 –