2013-06-02 4 views
1

У меня есть таблица MySQL с составным Первичным ключом.MySQL Composite Primary Key Duplicate

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(), но это то же самое.

Я искал вокруг, и, похоже, что-то явно не так. Я попробовал перестроить таблицы, но никаких изменений нет.

ответ

4

Вы вводите значение 74581 на classNum, но фактическое значение, которое будет вставлено, равно 32767.

Причина в том, что вы используете тип данных smallint(6) на столбце classNum, который имеет максимальное значение 32767. Попробуйте изменить тип данных, который может содержать больший диапазон числа, например. INT UNSIGNED

classNum INT UNSIGNED NOT NULL, 

для получения дополнительной информации о Числовой Тип данных Диапазон, пожалуйста, см ссылку ниже

+0

Это работало отлично, спасибо. Обычно я просто использую INT, но я пытался сохранить эту базу данных маленькой. Когда я посмотрел документы, почему-то у меня было это в голове, что значения были в тысячах, а не в десяти тысячах, так что я решил, что маленькая была в порядке. –

Смежные вопросы