Medium severityschema
MySQL Error:
1050
What does this error mean?
MySQL error 1050 wordt gegooid wanneer een CREATE TABLE statement probeert een tabel aan te maken die al bestaat in het opgegeven schema. De DDL-operatie wordt volledig afgebroken — er wordt niets aangemaakt of gewijzigd. In een data-pipeline manifesteert dit zich typisch als een mislukte migratieronde of een dbt run die vastloopt in de DDL-fase. De engineer ziet een rood job-resultaat in ADF, Airflow of dbt Cloud, met in de logs de melding 'Table already exists'. De tabel zelf blijft intact, maar de downstream transformaties die op deze tabel wachten, starten niet.
Common causes
- 1Een dbt model met `materialized='table'` probeert de tabel te droppen en opnieuw aan te maken, maar de DROP slaagde niet in een eerdere run. De tabel bestaat nog steeds en de nieuwe CREATE TABLE knalt er tegenaan.
- 2Een Flyway- of Liquibase-migratiescript bevat een bare CREATE TABLE zonder IF NOT EXISTS. Na een gedeeltelijk mislukte deployment staat de tabel al in de database, maar de migratietool beschouwt de versie als niet-toegepast en voert het script opnieuw uit.
- 3In Azure Data Factory wordt een Copy Activity gevolgd door een stored procedure die de doeltabel aanmaakt. Als de pipeline opnieuw wordt getriggerd na een gedeeltelijke mislukking — bijvoorbeeld door een retry-policy of een handmatige herstart — bestaat de tabel al van de eerste run.
- 4Parallelle Airflow DAG-runs: twee instanties van dezelfde DAG starten vrijwel gelijktijdig op en beide proberen dezelfde staging-tabel aan te maken. De tweede taak gooit 1050 omdat de eerste hem al aanmaakte.
- 5Een CI/CD-pipeline voert migratiescripts uit op een branch-database die niet is teruggezet naar de baseline. De tabel is al aangemaakt door een vorige test-run; de migratiescripts bevatten geen idempotentie-check.
- 6Handmatige SQL-scripts die door meerdere teamleden worden gedeeld en buiten het migratieframework om worden uitgevoerd, waardoor de schemastate afwijkt van wat het migratietool verwacht.
- 7Een ELT-tool zoals Fivetran of Stitch maakt bij initiële sync een staging-tabel aan. Als de sync wordt hergestart zonder de bestaande data te wissen — bijvoorbeeld na een connector reset — botst de nieuwe CREATE TABLE op de bestaande tabel.
How to fix it
- 1Stap 1: Controleer of de tabel bestaat en wat erin zit: `SHOW TABLES LIKE 'your_table';` en `DESCRIBE your_table;` — zo weet je of het een lege remnant is van een mislukte run of een tabel met productiedata die je niet mag droppen.
- 2Stap 2: Als de tabel veilig verwijderd kan worden (staging/temp): `DROP TABLE IF EXISTS your_table;` en voer daarna de CREATE TABLE opnieuw uit. Controleer eerst met `SELECT COUNT(*) FROM your_table;` of de tabel leeg is.
- 3Stap 3: Maak het CREATE TABLE-statement idempotent voor toekomstige runs: `CREATE TABLE IF NOT EXISTS your_table (id INT PRIMARY KEY, ...);` — MySQL slaat de aanmaak stilzwijgend over als de tabel al bestaat.
- 4Stap 4: In dbt — controleer de materialization config in het model. Bij `materialized='table'` doet dbt automatisch DROP TABLE IF EXISTS gevolgd door CREATE TABLE. Als 1050 toch optreedt, controleer of een pre-hook of macro handmatig een CREATE uitvoert die conflicteert: `grep -r 'CREATE TABLE' models/`
- 5Stap 5: Bij Flyway of Liquibase — herstel de migratiestatus handmatig: voor Flyway voer je `flyway repair` uit zodat de checksum-mismatch wordt opgelost, of markeer de versie als toegepast met `INSERT INTO flyway_schema_history (version, ...) VALUES ('V3', ...);` als de tabel inhoudelijk correct is.
- 6Stap 6: Voorkom parallelle aanmaak bij Airflow: voeg een `ExternalTaskSensor` of `BranchPythonOperator` toe die eerst checkt of de tabel al bestaat, of gebruik een database-lock via `SELECT GET_LOCK('create_your_table', 10);` aan het begin van de taak.
- 7Stap 7: Voeg schema-state validatie toe aan je CI/CD-pipeline: `mysql -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='yourdb' AND table_name='your_table';"` — bij returnwaarde > 0 laat de pipeline het aanmaakstap overslaan of stop de run met een duidelijke foutmelding.
Example log output
ERROR 1050 (42S01): Table 'staging_orders' already exists
[dbt] Database Error in model stg_orders (models/staging/stg_orders.sql): Table 'analytics.staging_orders' already exists
[ADF] Activity 'CreateStagingTable' failed: MySqlException: Table 'staging_orders' already exists (errno 1050)