Duplicate entry '0' for key 'PRIMARY'

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Dick VanBruggen

Dick VanBruggen

10/02/2022 21:46:47
Quote Anchor link
Regelmatig voer ik nieuwe artikelen in. Geheel onverwachts krijg ik bij opslaan de melding:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Duplicate entry '0' for key 'PRIMARY'

Het artikel wordt niet zichtbaar in de artikelenlijst. In de database blijkt de ID op nul te blijven staan.
In een oudere back-up komt dit niet voor. Ik heb alle database kolom-settings van de 2 versies vergeleken maar zie geen verschillen. Ook AUTO-INCREMENT van kolom ID staat aan. Heeft iemand een hint?
 
PHP hulp

PHP hulp

23/12/2024 05:47:38
 
- Ariën  -
Beheerder

- Ariën -

10/02/2022 22:41:07
Quote Anchor link
Hoe ziet je tabel eruit? Heb je een structuur-dump?
 

11/02/2022 08:37:27
Quote Anchor link
De foutmelding laat geen twijfel bestaan: je primaire index werkt en accepteert geen troep.

Een duplicate index kan op twee manieren onstaan:
1. de teller van de sequence (of AUTO_INCREMENT) is lager dan het hoogste ID
2. er wordt een andere waarde dan de default (sequence of AUTO_INCREMENT) ingevoerd in een INSERT-statement.

Voor geval 1 kan je achterhalen wat het hoogste id is: SELECT MAX(id) FROM tabel; en daarna ALTER TABLE tabel AUTO_INCREMENT=hoogstewaarde + 1;

Maar omdat de foutmelding expliciet '0' opgeeft, wordt in een INSERT-query de waarde 0 expliciet opgegeven. Die fout moet worden opgespoord en opgelost. Als het je eigen code is moet je het zelf doen, anders kan je het een ander laten doen.
 
Dick VanBruggen

Dick VanBruggen

16/02/2022 14:47:08
Quote Anchor link
Dank voor alle reacties en excuses voor mijn late reactie. De oplossing is voor mij nog steeds belangrijk maar door andere bezigheden, die nog even duren, reageer binnenkort.
 
- Ariën  -
Beheerder

- Ariën -

16/02/2022 14:57:11
Quote Anchor link
Zou te maken kunnen hebben met een STRICT mode? Ik kan mij herinneren dat ik vroeger alles als waarde voor in de INSERT kon invullen, en dat het Auto Increment systeem dat overrulde.

In ieder geval kan je zulke fratsen tegengaan door de nodige kolommen mee te geven:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);


Dit had ook gekund, maar bij een uitbreiding van een extra veld in de tabel, leidt dit meteen tot problemen als je de query niet aanpast:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
 
Dick VanBruggen

Dick VanBruggen

23/02/2022 23:04:33
Quote Anchor link
Ad Fundum op 11/02/2022 08:37:27:
De foutmelding laat geen twijfel bestaan: je primaire index werkt en accepteert geen troep.

Een duplicate index kan op twee manieren onstaan:
1. de teller van de sequence (of AUTO_INCREMENT) is lager dan het hoogste ID
2. er wordt een andere waarde dan de default (sequence of AUTO_INCREMENT) ingevoerd in een INSERT-statement.

Voor geval 1 kan je achterhalen wat het hoogste id is: SELECT MAX(id) FROM tabel; en daarna ALTER TABLE tabel AUTO_INCREMENT=hoogstewaarde + 1;

Maar omdat de foutmelding expliciet '0' opgeeft, wordt in een INSERT-query de waarde 0 expliciet opgegeven. Die fout moet worden opgespoord en opgelost. Als het je eigen code is moet je het zelf doen, anders kan je het een ander laten doen.




Toevoeging op 23/02/2022 23:09:49:

Ad Fundum op 11/02/2022 08:37:27:
De foutmelding laat geen twijfel bestaan: je primaire index werkt en accepteert geen troep.

Een duplicate index kan op twee manieren onstaan:
1. de teller van de sequence (of AUTO_INCREMENT) is lager dan het hoogste ID
2. er wordt een andere waarde dan de default (sequence of AUTO_INCREMENT) ingevoerd in een INSERT-statement.

Voor geval 1 kan je achterhalen wat het hoogste id is: SELECT MAX(id) FROM tabel; en daarna ALTER TABLE tabel AUTO_INCREMENT=hoogstewaarde + 1;

Maar omdat de foutmelding expliciet '0' opgeeft, wordt in een INSERT-query de waarde 0 expliciet opgegeven. Die fout moet worden opgespoord en opgelost. Als het je eigen code is moet je het zelf doen, anders kan je het een ander laten doen.


Ik heb de hoogste ID gecontroleerd. Het volgende artikel zet de ID netjes 1 hoger. Het probleem wordt echter nog duidelijker als ik een bestaand artikel wijzig en weer opsla. Ook dan komt de foutmelding. De wijziging in het artikel wordt echter wel doorgevoerd.

Toevoeging op 23/02/2022 23:19:06:

- Ariën - op 16/02/2022 14:57:11:
Zou te maken kunnen hebben met een STRICT mode? Ik kan mij herinneren dat ik vroeger alles als waarde voor in de INSERT kon invullen, en dat het Auto Increment systeem dat overrulde.

In ieder geval kan je zulke fratsen tegengaan door de nodige kolommen mee te geven:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);


Dit had ook gekund, maar bij een uitbreiding van een extra veld in de tabel, leidt dit meteen tot problemen als je de query niet aanpast:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
INSERT INTO table_name
VALUES (value1, value2, value3, ...);




Ik heb de volgende code uitgevoerd:
Quote:
SELECT * FROM `jos_content` WHERE 1;
alter TABLE `jos_content` ADD `test` int(10) UNSIGNED NOT NULL DEFAULT 0;
INSERT INTO jos_content (test) VALUES (10);


De foutmelding blijft helaas. Je vraagt om een structuur dump. Sorry, maar hoe maak ik die?
 
- Ariën  -
Beheerder

- Ariën -

23/02/2022 23:51:38
Quote Anchor link
phpMyAdmin en dan expoteren.
Of in de CLI (commandline):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
mysqldump --no-data -u jouwusername -p jouwdatabase > dump.sql
Gewijzigd op 23/02/2022 23:52:22 door - Ariën -
 
Ivo P

Ivo P

24/02/2022 10:27:08
Quote Anchor link
ik denk dat je op zoek met naar de plek waar PHP de insert-query opbouwt.
De structuur lijkt in orde:
* er wordt geklaagd over een primary key, dus de kolom IS een primary key
* je hebt gecontroleerd dat er AUTOINCREMNT voor die kolom is aangevinkt.

Dan blijft over dat je insert query iets doet als
INSERT INTO jetabel (idkolom, andere, kolommen)
VALUES (0, 'foo', 'bar')

De structuur van je database kan niet op tegen die 0. Als jij expliciet een waarde opgeeft dan wordt gepoogd die te gebruiken en gaat de database niet te rade bij de auto-increment-lijst.

Als auto-increment vindt dat de volgende waarde 100 is, en jij daar 9000 insert: prima.
als jij 50 insert, terwijl die al was verwijderd: ook prima.
Maar geen dubbele.
0 gaat 1x goed, aangezien auto-increment doorgaans bij 1 begint, maar nog een keer 0 inserten leidt tot een foutmelding.

En mogelijk is het iets wat hier indirect toe leidde, omdat je een waarde naar een integer cast, terwijl die vroeger null was.
Maar ik zeg: spoor die query op en zoek uit waarom daar 0 staat.

Of beter nog:
Waarom staat bij het inserten er kennelijk een waarde opgegeven voor een auto-increment kolom:
De query die ik eerder gaf zou moeten werken als:
INSERT INTO jetabel ( andere, kolommen)
VALUES ( 'foo', 'bar')

Dan zoekt je database er een leuke passende waarde bij.
Er zijn ook mensen die dan NULL in de kolom laten inserten en er vervolgens op vertrouwen dat MySQL dit weer overrulet naar een hoogsteid+1.
Maar waarom zou je dat doen: je zet jezelf op het verkeerde been.
 

24/02/2022 13:33:32
Quote Anchor link
Dick VanBruggen op 23/02/2022 23:04:33:
Ik heb de hoogste ID gecontroleerd. Het volgende artikel zet de ID netjes 1 hoger. Het probleem wordt echter nog duidelijker als ik een bestaand artikel wijzig en weer opsla. Ook dan komt de foutmelding. De wijziging in het artikel wordt echter wel doorgevoerd.

Klinkt alsof er meerdere regels tegelijk worden bijgewerkt.
Weet je 100% zeker dat je op de goede plek kijkt?

Als de '0' op de PK wordt veroorzaakt door MySQL, dan kan je met ALTER TABLE x ALTER COLUMN y DROP DEFAULT; de standaardwaarde wissen. Als dat het niet is moet je het in PHP zoeken.
Gewijzigd op 24/02/2022 13:34:34 door
 
Ivo P

Ivo P

24/02/2022 13:40:37
Quote Anchor link
Als een update query dit ook veroorzaakt dan ziet je update query er ongeveer zo uit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
UPDATE tabel
SET id = 0, kolom = 'foo', kolom2 = 'bar'
WHERE id = 123


Dat zou de foutmelding veroorzaken over een duplicate entry 0.
Maar dan zou de query moeten mislukken en niets bijwerken.

Tenzijn jouw script elke kolom in een afzonderlijke query update

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
UPDATE tabel
SET id kolom2 = 'bar'
WHERE id = 123

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
UPDATE tabel
SET id = 0
WHERE id = 123

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
UPDATE tabel
SET id =  kolom = 'foo'
WHERE id = 123


Of je doet iets raars met een trigger op die tabel
 
Dick VanBruggen

Dick VanBruggen

28/02/2022 23:28:36
Quote Anchor link
Dank voor alle reacties en het meedenken. Ik heb een niet zo elegante maar wel effectieve oplossing gevonden:
Ik gebruik de database voor een Joomla site die bijna gereed is. In het control panel van Joomla worden bij opstart de extensies gecontroleerd. Ik zie hier nu staan: onbekende extensie. Ik heb iedere week een backup gemaakt en ben terug gegaan totdat ik een versie trof waar deze melding niet verschijnt. Hier blijkt ook de eerder genoemde fout niet op te treden bij het opslaan en wijzigen van artikelen. Hoe de fout er in geslopen is is me een raadsel.
Ik heb nu in de werkende versie alle volgende wijzigingen aangebracht zodat mijn site weer up-to-date is.
 
Ozzie PHP

Ozzie PHP

28/02/2022 23:48:56
Quote Anchor link
En wat is dan precies de 'oplossing'?

Wellicht is de fout een gevolg van een update en komt diezelfde fout weer terug zodra je update?
 
Dick VanBruggen

Dick VanBruggen

01/03/2022 11:23:57
Quote Anchor link
Ozzie PHP op 28/02/2022 23:48:56:
En wat is dan precies de 'oplossing'?

Wellicht is de fout een gevolg van een update en komt diezelfde fout weer terug zodra je update?


Ik ben benieuwd!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.