【问题标题】:MySQL Composite Primary Key DuplicateMySQL复合主键重复
【发布时间】:2013-06-02 06:39:20
【问题描述】:

我有一个带有复合主键的 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 () 行中切换字段的顺序,但都是一样的。

我四处寻找,似乎没有任何明显的错误。我尝试重建表,但那里没有任何变化。

【问题讨论】:

    标签: mysql sql phpmyadmin


    【解决方案1】:

    您在classNum 上插入74581 的值,但要插入的实际值是32767

    原因是因为您在列classNum 上使用了smallint(6) 数据类型,其最大值为32767。尝试更改可以容纳更大范围数字的数据类型,例如。 INT UNSIGNED

    classNum INT UNSIGNED NOT NULL,
    

    有关数值数据类型范围的更多信息,请参阅下面的链接

    【讨论】:

    • 这很好用,谢谢。我通常只使用 INT,但我试图保持这个数据库很小。当我查看文档时,出于某种原因,我脑海中的值是千,而不是万,所以我认为 smallint 没问题。
    猜你喜欢
    • 2016-07-04
    • 2013-03-05
    • 1970-01-01
    • 2014-08-24
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2013-03-16
    相关资源
    最近更新 更多