ПУСТОЙ ТАБЛИЦА Дублирующая запись «1» для ключа «ПЕРВИЧНЫЙ» - PullRequest
2 голосов
/ 07 апреля 2019

У меня странная проблема с моей базой данных 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): повторяющаяся запись '1' для ключа 'PRIMARY'

Если я выполню тот же запрос еще раз:

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 ]

2 голосов
/ 11 мая 2019

Первая вставка создала id = 1. Это потому, что «0» (или NULL) обрабатывается специально, чтобы означать «дай мне следующий идентификатор». Затем вторая строка попыталась явно вставить id = 1 и получила «дубликат».

Включен ли в ваш дамп строка с id = 0, как вы подразумеваете в комментарии. Это звучит неправильно.

1 голос
/ 07 апреля 2019
Атрибут

AUTO_INCREMENT может использоваться для создания уникального идентификатора для новых строк.

Вы также можете явно присвоить 0 столбцу для генерации порядковых номеров, если не включен режим SQL NO_AUTO_VALUE_ON_ZERO .

Подробнее читайте здесь

1 голос
/ 07 апреля 2019

При использовании автоинкремента 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');

в целом не вставляйте 0 для идентификатора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...