错误代码:1062。键“PRIMARY”的值“1”重复。

42

我在这个错误信息上遇到了问题,当我尝试执行以下操作时:

INSERT INTO `PROGETTO`.`UFFICIO-INFORMAZIONI` (`ID`, `viale`, `num_civico`,  
`data_apertura`, `data_chiusura`, `orario_apertura`, `orario_chiusura`, 
`telefono`, `mail`, `web`, `Nome-paese`, `Comune`) 
VALUES (1, 'Viale Cogel ', '120', '2012-05-21', '2012-09-30', '08:00', '23:30',
'461801243', 'informazioni@bolzano.it', 'Bolzanoturismo.it', 'Bolzano', 'BZ')

错误代码:1062。为主键“PRIMARY”重复输入 '1'

我没有自动增量数据,请帮忙!

这是相关的表,UFFICIO-INFORMAZIONI

CREATE  TABLE IF NOT EXISTS `PROGETTO`.`UFFICIO-INFORMAZIONI` (
  `ID` INT(11) NOT NULL ,
  `viale` VARCHAR(45) NULL ,
  `num_civico` VARCHAR(5) NULL ,
  `data_apertura` DATE NULL ,
  `data_chiusura` DATE NULL ,
  `orario_apertura` TIME NULL ,
  `orario_chiusura` TIME NULL ,
  `telefono` VARCHAR(15) NULL ,
  `mail` VARCHAR(100) NULL ,
  `web` VARCHAR(100) NULL ,
  `Nome-paese` VARCHAR(45) NOT NULL ,
  `Comune` CHAR(2) NOT NULL ,
  PRIMARY KEY (`ID`) ,
  INDEX `Nome_paese` (`Nome-paese` ASC) ,
  INDEX `Comune` (`Comune` ASC) ,
  CONSTRAINT `Nome_paese`
    FOREIGN KEY (`Nome-paese` )
    REFERENCES `PROGETTO`.`PAESE` (`Nome-paese` )
    ON DELETE NO ACTION
    ON UPDATE CASCADE,
  CONSTRAINT `Comune`
    FOREIGN KEY (`Comune` )
    REFERENCES `PROGETTO`.`PAESE` (`Comune` )
    ON DELETE NO ACTION
    ON UPDATE CASCADE)
ENGINE = InnoDB

插入数据到

INSERT INTO `PROGETTO`.`UFFICIO-INFORMAZIONI` (`ID`, `viale`, `num_civico`, `data_apertura`, `data_chiusura`, `orario_apertura`, `orario_chiusura`, `telefono`, `mail`, `web`, `Nome-paese`, `Comune`) VALUES (1, 'Viale Cogel ', '120', '2012-05-21', '2012-09-30', '08:00', '23:30', '461801243', 'informazioni@bolzano.it', 'Bolzanoturismo.it', 'Bolzano', 'BZ');
    INSERT INTO `PROGETTO`.`UFFICIO-INFORMAZIONI` (`ID`, `viale`, `num_civico`, `data_apertura`, `data_chiusura`, `orario_apertura`, `orario_chiusura`, `telefono`, `mail`, `web`, `Nome-paese`, `Comune`) VALUES (2, 'Via Olmo', '45', '2012-05-01', '2012-09-30', '08:00', '23:30', '393495169301', 'informazioni@lech.it', 'Lechinformation.it', 'Lech', 'BZ');
    INSERT INTO `PROGETTO`.`UFFICIO-INFORMAZIONI` (`ID`, `viale`, `num_civico`, `data_apertura`, `data_chiusura`, `orario_apertura`, `orario_chiusura`, `telefono`, `mail`, `web`, `Nome-paese`, `Comune`) VALUES (3, 'Via Quercia', '37', '2012-05-11', '2012-09-30', '08:00', '23:30', '393381679321', 'info@trento.it', 'Trentoinformaiozni.it', 'Trento', 'TN');
    INSERT INTO `PROGETTO`.`UFFICIO-INFORMAZIONI` (`ID`, `viale`, `num_civico`, `data_apertura`, `data_chiusura`, `orario_apertura`, `orario_chiusura`, `telefono`, `mail`, `web`, `Nome-paese`, `Comune`) VALUES (4, 'Via Atene', '76', '2012-06-01', '2012-09-15', '08:00', '23:30', '39349361345', 'info@sanmartinodicastrozza.it', 'SanMartino.it', 'San Martino di Castrozza', 'TN');
    INSERT INTO `PROGETTO`.`UFFICIO-INFORMAZIONI` (`ID`, `viale`, `num_civico`, `data_apertura`, `data_chiusura`, `orario_apertura`, `orario_chiusura`, `telefono`, `mail`, `web`, `Nome-paese`, `Comune`) VALUES (5, 'Via Salice', '45', '2012-05-01', '2012-09-20', '08:00', '23:30', NULL, 'info@pejo.it', 'Pejoturismo.it', 'Pejo', 'TN');
    INSERT INTO `PROGETTO`.`UFFICIO-INFORMAZIONI` (`ID`, `viale`, `num_civico`, `data_apertura`, `data_chiusura`, `orario_apertura`, `orario_chiusura`, `telefono`, `mail`, `web`, `Nome-paese`, `Comune`) VALUES (6, 'Piazza Sempreverde', '34', '2012-05-15', '2012-09-15', '08:00', '23:30', '392516789', 'info@ortisei.it', 'Ortisei.it', 'Ortisei', 'BZ');

所以,表中已经有一个ID=1的记录。由于IDPRIMARY KEY,不能有多个具有相同值的记录。您希望这个操作做什么?忽略新插入?更新现有记录?替换现有记录? - eggyal
你确定这些错误是指向该表的主键吗?它应该指向其他表中的其他ID吗? - Alepac
0 14:55:20 将数据插入到 PROGETTO.UFFICIO-INFORMAZIONI 表中 (ID, viale, num_civico, data_apertura, data_chiusura, orario_apertura, orario_chiusura, telefono, mail, web, Nome-paese, Comune) VALUES (1, 'Viale Cogel ', '120', '2012-05-21', '2012-09-30', '08:00', '23:30', '461801243', 'informazioni@bolzano.it', 'Bolzanoturismo.it', 'Bolzano', 'BZ')。错误代码:1062。主键 'PRIMARY' 已存在重复条目 '1'。 - FrancescoN
可能你的问题与外键有关,我正在尝试使用[sql fiddle](http://sqlfiddle.com/#!2/c6fb9)复制您的问题,但没有成功。您能提供完整的数据库架构吗? - Alepac
http://dl.dropbox.com/u/60796322/ultimateProgetto.sql - FrancescoN
10个回答

35

错误产生的主要原因是在您正在插入的表中,您为列ID定义了PRIMARY KEY值唯一),而该列中已经存在一个值1

为什么不将列ID设置为AUTO_INCREMENT

CREATE  TABLE IF NOT EXISTS `PROGETTO`.`UFFICIO-INFORMAZIONI` (
  `ID` INT(11) NOT NULL AUTO_INCREMENT,
  `viale` VARCHAR(45) NULL ,
   .....

当您插入记录时,现在可以跳过列ID

INSERT INTO `PROGETTO`.`UFFICIO-INFORMAZIONI` (`viale`, `num_civico`, ...) 
VALUES ('Viale Cogel ', '120', ...)

2
我刚刚添加了所有的INSERT INTO; 没有重复的PK..那是因为我不明白发生了什么。 - FrancescoN
我已经删除了模式并重新创建了两次... 我总是得到相同的错误,如上所示。 编辑:auto_increment可能是一个选项,但即使没有它也可以工作... - FrancescoN
你使用的脚本中可能有插入语句来重新创建表吗? - Adder
解决了:当我编辑mysql文件时,我在另一个INSERT INTO上进行了剪切和粘贴...所以很明显有至少两个ID具有相同的编号。无论如何,现在我知道了这种自动增量的方式,谢谢! - FrancescoN
在这个视频中,“Cust_ID”两次包含“wilson44”... - Lealo
显示剩余2条评论

23
如果您正在使用 PHPMyAdmin,您可以通过执行以下步骤解决此问题:

注意:如果您想要保留表中现有记录,请勿使用此解决方案。

步骤1:选择数据库导出方法为“自定义”:

输入图像说明

步骤2:请确保在数据创建选项中勾选“插入之前清除表格”:

输入图像说明

现在,您将能够成功地导入该数据库。

这是在使用phpmyadmin或终端从另一个地方导入数据库时,一个好的省时解决方案之一。 - mapmalith
尝试在一个巨大的表上创建新索引时,我采取了重命名、从旧表创建新表、添加索引,然后从旧表插入的方法。即使在空的新表上也会出现重复的主键错误。在复制数据之前截断它可以解决这个问题。 - OK sure

13
如果您有一个新的数据库并进行了全新的干净导入操作,则可能出现问题是因为插入数据包含“0”增量,并且这将转换为“1”,从而使用 AUTO_INCREMENT 并引起此错误。
我的解决方案是在 SQL 导入文件中使用。
SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';

8

如果您正在尝试使用 SQL 转储填充表格,请确保“INSERT INTO”语句中列出的表格与您要填充的表格相同。如果转储文件试图将条目放入“MyOtherTable”中,而该表可能已经包含了条目,则打开“ MyTable”并使用 SQL 转储导入会出现这种错误。


3

同时检查您的触发器。

我遇到过这样一个问题,历史表触发器试图将主表的id插入到历史表的id中,而不是正确的hist-table.source_id列。

更新语句根本没有涉及id列,所以花费了一些时间才找到:

UPDATE source_table SET status = 0;

触发器试图执行类似于以下内容的操作:

FOR EACH ROW
BEGIN
    INSERT INTO `history_table` (`action`,`id`,`status`,`time_created`)
    VALUES('update', NEW.id, NEW.status, NEW.time_created);
END;

被更正为像这样:

FOR EACH ROW
BEGIN
    INSERT INTO `history_table` (`action`,`source_id`,`status`,`time_created`)
    VALUES('update', NEW.id, NEW.status, NEW.time_created);
END;

2

当我遇到这种错误时,我必须将数据类型升级一档。例如,如果我的数据类型是“tiny int”,就需要更改为“small int”。 ~ Nita


2
问题与您的文件有关 - 您正在尝试使用副本创建DB - 在您的文件顶部,您将找到以下内容:
CREATE DATABASE IF NOT EXISTS *THE_NAME_OF_YOUR_DB* DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci; USE *THE_NAME_OF_YOUR_DB*;
我相信您已经有了一个具有相同名称的DB - 在同一台服务器上 - 请检查。只需更改名称或删除此行即可!

1
我刚遇到了同样的问题,但似乎是因为我声明了ID列为无符号类型,并且与ID值为“0”(零)相结合导致导入失败...所以通过更改我声明为“0”的每个ID(PK列)的值以及每个相应的FK到新值,我的问题得到解决。

-1

使用MySQL Workbench导入/导出

当我使用MySQL Workbench数据导出时,我遇到了与op相同的错误。我手动将特定的表从一个本地设备移动到另一个本地设备;两个设备都有MySQLWB。

失败:仅数据导出

在导入时,我遇到了如下错误: ERROR 1062 (23000) at line 83: Duplicate entry '' for key...

成功:结构和数据导出

没有其他更改;其他所有内容保持不变。


-2

导出表数据并删除表。

DROP TABLE table_name;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接