Enforce natural key uniqueness by adding unique constraints to Bundesland, Platz, Altersklasse, and Land tables.

This commit is contained in:
Stefan Mogeritsch 2026-03-28 20:52:58 +01:00
parent 74df3514ae
commit 9ec8535ff7
3 changed files with 51 additions and 0 deletions

View File

@ -0,0 +1,46 @@
-- Enforce natural key uniqueness for master-data upserts
-- Bundesland: unique (land_id, kuerzel) for non-null kuerzel values
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_indexes WHERE schemaname = 'public' AND indexname = 'ux_bundesland_land_kuerzel'
) THEN
CREATE UNIQUE INDEX ux_bundesland_land_kuerzel
ON bundesland(land_id, kuerzel)
WHERE kuerzel IS NOT NULL;
END IF;
END$$;
-- Platz: unique (turnier_id, name)
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_indexes WHERE schemaname = 'public' AND indexname = 'ux_platz_turnier_name'
) THEN
CREATE UNIQUE INDEX ux_platz_turnier_name
ON platz(turnier_id, name);
END IF;
END$$;
-- Altersklasse: unique (altersklasse_code) ensure index exists
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_indexes WHERE schemaname = 'public' AND indexname = 'altersklasse_altersklasse_code_unique'
) THEN
CREATE UNIQUE INDEX altersklasse_altersklasse_code_unique
ON altersklasse(altersklasse_code);
END IF;
END$$;
-- Land: unique (iso_alpha3_code) ensure index exists
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_indexes WHERE schemaname = 'public' AND indexname = 'land_iso_alpha3_code_unique'
) THEN
CREATE UNIQUE INDEX land_iso_alpha3_code_unique
ON land(iso_alpha3_code);
END IF;
END$$;

View File

@ -27,5 +27,8 @@ object BundeslandTable : Table("bundesland") {
init {
uniqueIndex("idx_bundesland_oeps", oepsCode, landId)
uniqueIndex("idx_bundesland_iso", iso3166_2_Code)
// Natürlicher Schlüssel gem. Architektur: (land_id + kuerzel) eindeutig
// Hinweis: kuerzel kann NULL sein der Unique-Index greift dann nur für nicht-null Werte pro Land.
uniqueIndex("ux_bundesland_land_kuerzel", landId, kuerzel)
}
}

View File

@ -25,5 +25,7 @@ object PlatzTable : Table("platz") {
init {
index("idx_platz_turnier", isUnique = false, turnierId)
// Natürlicher Schlüssel gem. Architektur: (turnier_id + name) eindeutig
uniqueIndex("ux_platz_turnier_name", turnierId, name)
}
}