空表密钥“ PRIMARY”的重复条目“ 1”

时间:2019-04-07 09:53:16

标签: mysql mariadb

我的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有关,但是我想插入一个巨大的数据库转储。这是错误,还是预期的行为?

3 个答案:

答案 0 :(得分:2)

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

您的转储中是否包含id = 0的行,就像您在“注释”中所暗示的那样。听起来不对。

答案 1 :(得分:1)

使用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

答案 2 :(得分:1)

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

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

Read here for more details