【问题标题】:EMPTY TABLE Duplicate entry '1' for key 'PRIMARY'EMPTY TABLE 键 'PRIMARY' 的重复条目 '1'
【发布时间】:2019-08-28 16:08:35
【问题描述】:

我的 MariaDB 数据库有一个奇怪的问题。我使用以下代码创建了一个空表:

drop table if exists Subject;
CREATE TABLE Subject (
  id integer primary key auto_increment,
  code varchar(100) unique not null,
  name text not null
);

查询执行正常,0 行受影响。

我尝试在表格中插入一些数据:

INSERT INTO Subject (id, code, name) VALUES
(0,'KMI/AIdb/PHW/15','Počítačový hardvér'),
(1,'KMI/AIdb/DBA/15','Tvorba databázových aplikácií'),
(2,'KMI/SPRVdb/INF/16','Informatika a základy správy databáz'),
(3,'KMI/AIdb/PR4/15','Programovanie 4 - Objektové programovanie'),
(4,'KMI/AIdb/DBS/15','Databázové informačné systémy');

查询错误 (1062):键 'PRIMARY' 的重复条目 '1'

如果我再次运行相同的查询:

INSERT INTO Subject (id, code, name) VALUES
(0,'KMI/AIdb/PHW/15','Počítačový hardvér'),
(1,'KMI/AIdb/DBA/15','Tvorba databázových aplikácií'),
(2,'KMI/SPRVdb/INF/16','Informatika a základy správy databáz'),
(3,'KMI/AIdb/PR4/15','Programovanie 4 - Objektové programovanie'),
(4,'KMI/AIdb/DBS/15','Databázové informačné systémy');

查询执行正常,有 5 行受到影响。

我相信它与 auto_increment 有关,但我有一个巨大的数据库转储,我想插入。这是一个错误,还是预期的行为?

【问题讨论】:

    标签: mysql mariadb


    【解决方案1】:

    第一个插入创建的 id=1。这是因为“0”(或NULL)被特殊处理为“给我下一个ID”。然后第二行尝试显式插入 id=1 并得到一个“重复”。

    您的转储是否包含 id=0 的行,正如您在评论中暗示的那样。听起来不对。

    【讨论】:

      【解决方案2】:

      AUTO_INCREMENT 属性可用于为新行生成唯一标识。

      除非启用了 NO_AUTO_VALUE_ON_ZERO SQL 模式,否则您还可以为列显式分配 0 以生成序列号。

      Read here for more details

      【讨论】:

        【解决方案3】:

        使用 id 自动增量不插入 id

        INSERT INTO Subject (code, name) VALUES
        ('KMI/AIdb/PHW/15','Počítačový hardvér'),
        ('KMI/AIdb/DBA/15','Tvorba databázových aplikácií'),
        ('KMI/SPRVdb/INF/16','Informatika a základy správy databáz'),
        ('KMI/AIdb/PR4/15','Programovanie 4 - Objektové programovanie'),
        ('KMI/AIdb/DBS/15','Databázové informačné systémy');
        

        总体上不要为id插入0

        【讨论】:

        • 我必须插入 ID,因为这是一个数据库转储,并且 id-s 是从其他表中交叉引用的。如果我只是让 auto_increment 完成这项工作,那么 ID 将不匹配。零也是如此,如果我删除 ID 零,交叉引用就会中断。为什么它第二次起作用了?
        • 然后您可以更改表(临时)撤销自动增量,以便您可以更轻松地管理 id ..您可以在转储导入完成后添加自动增量...但请确保你没有复制主键
        猜你喜欢
        • 2019-07-03
        • 1970-01-01
        • 2014-02-02
        • 2017-02-17
        • 2013-01-15
        • 2013-09-01
        • 1970-01-01
        • 2012-07-23
        • 2013-09-30
        相关资源
        最近更新 更多