我有一个带有复合主键的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
作为主键,但事实证明,就条款而言,它实际上可能会重复。为避免出现问题,我希望将classNum
和termNum
合并到主键中。最初我添加数据的查询是这样的:
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()行中切换字段的顺序,但它是一样的。
我已经四处寻找,似乎没有任何明显的错误。我尝试重建表格,但没有改变。
答案 0 :(得分:4)
您在74581
上插入classNum
的值,但要插入的实际值为32767
。
原因是您在smallint(6)
列上使用classNum
数据类型,其最大值为32767
。尝试更改可以容纳更大范围数字的数据类型,例如INT UNSIGNED
classNum INT UNSIGNED NOT NULL,
有关数值数据类型范围的更多信息,请参阅下面的链接