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?
Hoe ziet je tabel eruit? Heb je een structuur-dump?
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.
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.
In ieder geval kan je zulke fratsen tegengaan door de nodige kolommen mee te geven:
Code (php)
1
2
2
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
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:
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.
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.
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:
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:
In ieder geval kan je zulke fratsen tegengaan door de nodige kolommen mee te geven:
Code (php)
1
2
2
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
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:
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);
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?
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.
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.
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
Of je doet iets raars met een trigger op die tabel
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.
Wellicht is de fout een gevolg van een update en komt diezelfde fout weer terug zodra je update?
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?
Wellicht is de fout een gevolg van een update en komt diezelfde fout weer terug zodra je update?
Ik ben benieuwd!