-- Duplikate entfernen: pro Gruppe (buchungstag, wertstellung, wert, buchungstext) die niedrigste id behalten DELETE bt FROM bank_transactions bt INNER JOIN ( SELECT MIN(id) AS keep_id, buchungstag, wertstellung, wert, buchungstext FROM bank_transactions GROUP BY buchungstag, wertstellung, wert, buchungstext HAVING COUNT(*) > 1 ) dup ON bt.buchungstag = dup.buchungstag AND bt.wertstellung = dup.wertstellung AND bt.wert = dup.wert AND bt.buchungstext = dup.buchungstext AND bt.id > dup.keep_id; -- Unvollständige Batches entfernen (row_count stimmt nicht mit tatsächlichen Zeilen überein) DELETE FROM bank_import_batches WHERE id NOT IN (SELECT DISTINCT batch_id FROM bank_transactions) AND row_count > 0; -- UNIQUE-Constraint gegen Doppel-Importe ALTER TABLE bank_transactions ADD CONSTRAINT uq_bank_tx UNIQUE (buchungstag, wertstellung, wert, buchungstext(200));