У меня есть таблица 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(), но это то же самое.
Я искал вокруг, и, похоже, что-то явно не так. Я попробовал перестроить таблицы, но никаких изменений нет.
Это работало отлично, спасибо. Обычно я просто использую INT, но я пытался сохранить эту базу данных маленькой. Когда я посмотрел документы, почему-то у меня было это в голове, что значения были в тысячах, а не в десяти тысячах, так что я решил, что маленькая была в порядке. –