3
votes

EMPTY TABLE Dupliquer l'entrée '1' pour la clé 'PRIMARY'

J'ai un problème étrange avec ma base de données MariaDB. Je crée une table vide avec le code suivant:

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');

Requête exécutée OK, 0 ligne affectée.

J'essaye d'insérer des données dans le tableau:

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');

Erreur dans la requête (1062): Dupliquer l'entrée '1' pour la clé 'PRIMARY'

Si j'exécute la même requête une fois de plus:

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

Requête exécutée OK, 5 lignes affectées.

Je pense que cela a quelque chose à voir avec l'auto_increment, mais j'ai un énorme vidage de base de données que j'aimerais insérer. S'agit-il d'un bogue ou est-ce un comportement attendu?


0 commentaires

3 Réponses :


1
votes

En utilisant l'auto-incrémentation d'identifiant, n'insérez pas l'identifiant

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');

dans l'ensemble, n'insérez pas 0 pour l'identifiant


2 commentaires

Je dois insérer l'ID car il s'agit d'un vidage de base de données et les id-s sont référencés à partir d'autres tables. Si je laisse simplement auto_increment faire le travail, les identifiants ne correspondent pas. Il en va de même pour zéro, si je supprime l'ID zéro, les références croisées se cassent. Pourquoi ça marche la deuxième fois?


alors vous pouvez modifier la table (temporairement) en révoquant l'incrémentation automatique afin de pouvoir gérer l'identifiant plus facilement .. vous pouvez ajouter l'auto-incrémentation une fois l'importation du vidage terminée ... mais assurez-vous que vous n'avez pas dupliqué la clé primaire



1
votes

L'attribut AUTO_INCREMENT peut être utilisé pour générer une identité unique pour les nouvelles lignes.

Vous pouvez également attribuer explicitement 0 à la colonne pour générer des numéros de séquence, sauf si le mode SQL NO_AUTO_VALUE_ON_ZERO est activé.

Lisez ici pour plus de détails


0 commentaires

2
votes

Le premier insert créé id = 1. C'est parce que "0" (ou NULL ) est traité spécialement pour signifier "donnez-moi l'identifiant suivant". Ensuite, la deuxième ligne a essayé d'insérer explicitement id = 1 et a obtenu un "doublon".

Votre vidage a-t-il inclus une ligne avec id = 0, comme vous l'impliquez dans un commentaire. Cela semble faux.


0 commentaires