Relevante software en hardware die ik gebruik
MySQL-server (MariaDB 10.0.28 op Debian testing)
Ik heb een database met daarin een aantal events. Om precies te zijn gaat het om TV-programma's. De data zijn afkomstig van de TV-kabel, en worden dagelijks geactualiseerd. De data zijn in een format:
Bijvoorbeeld:
Als voorwaarde zou moeten gelden dat de aanvangstijd van een programma NOOIT kan liggen TUSSEN de aanvangs- en eindetijd van een ander programma op diezelfde ZenderID, en ook dat de eindtijd van een programma nooit kan liggen tussen de aanvangs- en eindtijd van een ander programma. Dat zou namelijk betekenen dat in de overlappende tijd meer dan één programma op dezelfde zender wordt uitgezonden.
In de praktijk komt dat soms toch voor. Bijvoorbeeld wanneer de zender besluit tot wijzigingen. Ik kan dus op een bepaald moment
in de EPG-stream vinden, en een dag later
Ervan uitgaande dat de laatst aangeleverde record correct is wil ik dus de eerste record verwijderen en de tweede in plaats daarvan invoegen. Op zich heeft MySQL daarvoor een heel aardig commando, namelijk een REPLACE INTO. Dat werkt op zich identiek aan een INSERT INTO, behalve wanneer een INSERT zou leiden tot een schending van een constraint. In dat geval wordt de oude record verwijderd en de nieuwe ingevoegd. Maar dat heeft wel als voorwaarde dat de unique constraints goed gedefinieerd zijn.
Het is vast wel mogelijk er omheen te programmeren door de recentste gegevens in een aparte tabel te zetten, en dan een slimme join te doen, maar het REPLACE INTO is juist daarvoor bedoeld.
Ik zie in de MySQL-handleiding geen optie om de constraints zo te definiëren, ook niet in andere SQL-varianten trouwens. Een zoekactie leverde ook niet veel op, behalve onbeantwoorde vragen van mensen met een soortgelijke vraag.
MySQL-server (MariaDB 10.0.28 op Debian testing)
Ik heb een database met daarin een aantal events. Om precies te zijn gaat het om TV-programma's. De data zijn afkomstig van de TV-kabel, en worden dagelijks geactualiseerd. De data zijn in een format:
code:
1
| ZenderID, aanvang, einde, titel, samenvatting |
Bijvoorbeeld:
code:
1
| "NPO1", 2016/11/24 01:00.00, 2016/11/24 01:15.00, "Journaal", "Het laatste nieuws" |
Als voorwaarde zou moeten gelden dat de aanvangstijd van een programma NOOIT kan liggen TUSSEN de aanvangs- en eindetijd van een ander programma op diezelfde ZenderID, en ook dat de eindtijd van een programma nooit kan liggen tussen de aanvangs- en eindtijd van een ander programma. Dat zou namelijk betekenen dat in de overlappende tijd meer dan één programma op dezelfde zender wordt uitgezonden.
In de praktijk komt dat soms toch voor. Bijvoorbeeld wanneer de zender besluit tot wijzigingen. Ik kan dus op een bepaald moment
code:
1
| "NPO1", 2016/12/01 01:00.00, 2016/12/01 01:15.00, "Journaal", "Het laatste nieuws" |
in de EPG-stream vinden, en een dag later
code:
1
| "NPO1", 2016/12/01 01:10.00, 2016/12/01 01:25.00, "Een heel ander programma ", "" |
Ervan uitgaande dat de laatst aangeleverde record correct is wil ik dus de eerste record verwijderen en de tweede in plaats daarvan invoegen. Op zich heeft MySQL daarvoor een heel aardig commando, namelijk een REPLACE INTO. Dat werkt op zich identiek aan een INSERT INTO, behalve wanneer een INSERT zou leiden tot een schending van een constraint. In dat geval wordt de oude record verwijderd en de nieuwe ingevoegd. Maar dat heeft wel als voorwaarde dat de unique constraints goed gedefinieerd zijn.
Het is vast wel mogelijk er omheen te programmeren door de recentste gegevens in een aparte tabel te zetten, en dan een slimme join te doen, maar het REPLACE INTO is juist daarvoor bedoeld.
Ik zie in de MySQL-handleiding geen optie om de constraints zo te definiëren, ook niet in andere SQL-varianten trouwens. Een zoekactie leverde ook niet veel op, behalve onbeantwoorde vragen van mensen met een soortgelijke vraag.
[ Voor 3% gewijzigd door MSteverink op 25-11-2016 17:22 ]