-- Genre mixes: one daily system playlist per genre the user listens to -- ("Post-Punk mix", "Jazz mix", ...). Several per user, like -- songs_like_artist, but seedless: the genre lives in the playlist name and -- seed_artist_id is NULL. -- -- Postgres has no ALTER CONSTRAINT for CHECK, so both constraints are -- dropped and re-added with 'genre_mix' in the accepted set. ALTER TABLE playlists DROP CONSTRAINT IF EXISTS playlists_kind_variant_consistent; ALTER TABLE playlists ADD CONSTRAINT playlists_kind_variant_consistent CHECK ( (kind = 'user' AND system_variant IS NULL) OR (kind = 'system' AND system_variant IN ( 'for_you', 'songs_like_artist', 'discover', 'deep_cuts', 'rediscover', 'new_for_you', 'on_this_day', 'first_listens', 'genre_mix' )) ); ALTER TABLE playlists DROP CONSTRAINT IF EXISTS playlists_seed_consistent; ALTER TABLE playlists ADD CONSTRAINT playlists_seed_consistent CHECK ( (system_variant IS NULL AND seed_artist_id IS NULL) OR (system_variant = 'for_you' AND seed_artist_id IS NULL) OR (system_variant = 'discover' AND seed_artist_id IS NULL) OR (system_variant = 'deep_cuts' AND seed_artist_id IS NULL) OR (system_variant = 'rediscover' AND seed_artist_id IS NULL) OR (system_variant = 'new_for_you' AND seed_artist_id IS NULL) OR (system_variant = 'on_this_day' AND seed_artist_id IS NULL) OR (system_variant = 'first_listens' AND seed_artist_id IS NULL) OR (system_variant = 'genre_mix' AND seed_artist_id IS NULL) OR (system_variant = 'songs_like_artist' AND seed_artist_id IS NOT NULL) );