Duplikate in TYPO3 MM-Tabellen beseitigen
Worum geht es?
Im Zuge meiner TYPO3 v12 Upgrades stoße ich immer wieder auf die Fehlermeldung
Duplicate entry 'xxx-xxx' for key 'PRIMARY'
wenn ich versuche die Datenbankänderungen über "Verwaltungswerkzeuge" → "Wartung" → "Analyze Database Structure" auf den neuesten Stand zu bringen.
Ebenso verhält es sich, wenn ich das auf Konsolen-Ebene ausführen lasse über den Befehl:
typo3 database:updateschema
Voraussetzung für die Ausführung auf Konsolen-Ebene ist, dass ihr die EXT:typo3_console installiert habt.
Die Fehlermeldung könnte dann wie folgt aussehen:
The following errors occurred:
+------------+--------------------------------------------------------+-----------------------------+
| Type | SQL Statement | Message |
+------------+--------------------------------------------------------+-----------------------------+
| Add fields | ALTER TABLE | Duplicate entry '108-349' |
| | `tx_lccontact_contact_fieldworkerpostalcodes_postalcod | for key 'PRIMARY' |
| | e_mm` ADD PRIMARY KEY (uid_local, uid_foreign) | |
| | | |
| | ALTER TABLE | Duplicate entry '0-106' for |
| | `tx_lccontact_contact_fieldworkercountryfallback_count | key 'PRIMARY' |
| | rygroup_mm` ADD PRIMARY KEY (uid_local, uid_foreign) | |
| | | |
| | ALTER TABLE `sys_category_record_mm` ADD PRIMARY KEY | Duplicate entry |
| | (uid_local, uid_foreign, tablenames, fieldname) | '23-83-tx_news_domain_model |
| | | _news-categories' for key |
| | | 'PRIMARY' |
| | | |
+------------+--------------------------------------------------------+-----------------------------+
Im Beispiel sind MM-Tabellen der EXT:lc_contact
betroffen. Das gleiche habe ich aber beispielsweise auch schon im Rahmen von mm-Bezügen der EXT:news
festgestellt.
Mit dem folgenden Command seid ihr nun in der Lage diese Duplikate in MM-Tabellen zu bereinigen:
https://gist.github.com/ErHaWeb/67c9b561e9a38084d9322e3e8c41f988
Ausführung
Platziere dieses Skript in deiner Extension (z.B. deinem Sitepackage) unter EXT:sitepackage/Classes/Command/FixMmDuplicatesCommand.php
und passe gegebenenfalls die Namespace-Angabe an.
Da es sich bei diesem Prozess um ein Datenbank-Update handelt, muss es vor der Ausführung der Upgrade-Wizards ausgeführt werden.
Der Command wird wird dann wie folgt ausgeführt:
typo3 upgrade:fixmmduplicates
Achtung
Bitte beachtet, dass dieser Befehl die Felder sorting
und sorting_foreign
auf den Wert 0
setzt. Wenn ihr eine bessere Lösung für diese Felder habt, könnt ihr gerne eure Anpassungen im öffentlichen Gist beitragen.
Letzte Worte
Hattet ihr diesen Fall schonmal? Falls ja, wie habt ihr das denn bisher gelöst? Der Vorteil des Commands ist, dass man das ganz einfach Projekt-übergreifend mit wenig Aufwand nutzen kann, ohne sich über die konkreten Fehlerfälle Gedanken machen zu müssen.
Ich bin gespannt auf euer Feedback.