--DROP LANGUAGE IF EXISTS plpgsql CASCADE; --CREATE LANGUAGE plpgsql; DROP VIEW IF EXISTS sportler_alle_teilnahme_wettkampf CASCADE; DROP VIEW IF EXISTS sportler_teilnahme_wettkampf_alle CASCADE; DROP VIEW IF EXISTS sportler_alle_teilnahme_wettkampf_alle CASCADE; DROP VIEW IF EXISTS sportler_teilnahme_wettkampf CASCADE; DROP VIEW IF EXISTS sportler_teilnahme CASCADE; DROP VIEW IF EXISTS sportler_alle_teilnahme CASCADE; DROP VIEW IF EXISTS wettkampf_teilnahme CASCADE; DROP VIEW IF EXISTS wettkampf_alle_teilnahme CASCADE; DROP VIEW IF EXISTS teilnahme CASCADE; DROP VIEW IF EXISTS wettkampf CASCADE; DROP VIEW IF EXISTS sportler CASCADE; DROP TABLE IF EXISTS r_teilnahme CASCADE; DROP TABLE IF EXISTS e_wettkampf CASCADE; DROP TABLE IF EXISTS e_sportler CASCADE; DROP TABLE IF EXISTS enum_land CASCADE; DROP TABLE IF EXISTS enum_sportstaette CASCADE; DROP TABLE IF EXISTS enum_wettkampfart CASCADE; DROP TABLE IF EXISTS enum_sportart CASCADE; DROP TYPE IF EXISTS D_GESCHLECHT CASCADE; /***************************************************************************** * Datentypen und Tabellen *****************************************************************************/ -- CREATE DOMAIN IF NOT EXISTS D_UNTAINTED -- AS -- VARCHAR CHECK (value !~ '[<>"'';]|--|/\*'); DO $$ BEGIN CREATE DOMAIN D_UNTAINTED AS VARCHAR CHECK (value !~ '[<>"'';]|--|/\*'); EXCEPTION WHEN duplicate_object THEN null; END $$; CREATE DOMAIN D_GESCHLECHT AS CHAR(1) CHECK (VALUE IN ('w', 'm', 'x')); --CREATE CAST (D_GESCHLECHT AS CHAR(1)) WITHOUT FUNCTION AS IMPLICIT; -- Funktioniert leider nur als Superuser! :-( CREATE TABLE enum_sportart (id INTEGER NOT NULL, name D_UNTAINTED NOT NULL, CONSTRAINT enum_sportart_pk PRIMARY KEY (id), CONSTRAINT enum_sportart_unique_name UNIQUE (name) ); CREATE TABLE enum_wettkampfart (id INTEGER NOT NULL, sa_id INTEGER NOT NULL, name D_UNTAINTED NOT NULL, CONSTRAINT enum_wettkampfart_pk PRIMARY KEY (id), CONSTRAINT enum_wettkampfart_unique_sa_id_name UNIQUE (sa_id, name), CONSTRAINT enum_wettkampfart_fk_enum_sportart_id FOREIGN KEY (sa_id) REFERENCES enum_sportart(id) ); CREATE TABLE enum_sportstaette (id INTEGER NOT NULL, name D_UNTAINTED NOT NULL, CONSTRAINT enum_sportstaette_pk PRIMARY KEY (id), CONSTRAINT enum_sportstaette_unique_name UNIQUE (name) ); CREATE TABLE enum_land (id INTEGER NOT NULL, kuerzel CHAR(3) NOT NULL, name_de D_UNTAINTED NOT NULL, name_en D_UNTAINTED NOT NULL, name_fr D_UNTAINTED NOT NULL, CONSTRAINT enum_land_pk PRIMARY KEY (id), CONSTRAINT enum_land_unique_kuerzel UNIQUE (kuerzel), CONSTRAINT enum_land_unique_name_de UNIQUE (name_de), CONSTRAINT enum_land_unique_name_en UNIQUE (name_en), CONSTRAINT enum_land_unique_name_fr UNIQUE (name_fr) ); CREATE TABLE e_sportler (id INTEGER NOT NULL, name D_UNTAINTED NOT NULL, vorname D_UNTAINTED, geburtstag DATE NOT NULL, l_id INTEGER NOT NULL, geschlecht D_GESCHLECHT NOT NULL, CONSTRAINT e_sportler_pk PRIMARY KEY (id), CONSTRAINT e_sportler_unique_name_vorname_geburtstag_land UNIQUE (name, vorname, geburtstag, l_id), CONSTRAINT e_sportler_fk_enum_land_id FOREIGN KEY (l_id) REFERENCES enum_land(id), CONSTRAINT sportler_check_geschlecht CHECK (geschlecht <> 'x') ); CREATE TABLE e_wettkampf (id INTEGER NOT NULL, wa_id INTEGER NOT NULL, geschlecht D_GESCHLECHT NOT NULL, spst_id INTEGER NOT NULL, beginn TIMESTAMP NOT NULL, CONSTRAINT wettkampf_pk PRIMARY KEY (id), CONSTRAINT wettkampf_unique_sportart_wettkampfart_geschlecht UNIQUE (wa_id, geschlecht), CONSTRAINT wettkampf_fk_enum_wettkampfart_id FOREIGN KEY (wa_id) REFERENCES enum_wettkampfart(id), CONSTRAINT wettkampf_fk_enum_sportstaette_id FOREIGN KEY (spst_id) REFERENCES enum_sportstaette(id) ); CREATE TABLE r_teilnahme (s_id INTEGER NOT NULL, w_id INTEGER NOT NULL, platz INTEGER, doping BOOLEAN, disqualifiziert BOOLEAN NOT NULL DEFAULT FALSE, CONSTRAINT teilnahme_pk PRIMARY KEY (s_id, w_id), CONSTRAINT teilnahme_fk_sportler_id FOREIGN KEY (s_id) REFERENCES e_sportler(id), CONSTRAINT teilnahme_fk_wettkampf_id FOREIGN KEY (w_id) REFERENCES e_wettkampf(id), CONSTRAINT t_teilnahme_platz_groesser_0 CHECK (platz > 0), CONSTRAINT t_teilnahme_doper_werden_disqualifiziert CHECK (NOT (doping IS TRUE AND disqualifiziert IS FALSE)), CONSTRAINT t_teilnahme_disqualifizierte_belegen_keinen_platz CHECK (NOT (disqualifiziert IS TRUE AND platz IS NOT NULL)) ); /***************************************************************************** * Komplexe Check-Constraints. *****************************************************************************/ /* CREATE ASSERTION platz_nicht_zu_gross CHECK (NOT EXISTS (SELECT * FROM r_teilnahme t1 WHERE platz > (SELECT COUNT(*) FROM r_teilnahme t2 WHERE t1.w_id = t2.w_id AND t2.platz IS NOT NULL ) ) ) ; */ DROP TRIGGER IF EXISTS platz_nicht_zu_gross_trigger ON r_teilnahme; DROP FUNCTION IF EXISTS platz_nicht_zu_gross() CASCADE; CREATE FUNCTION platz_nicht_zu_gross() RETURNS TRIGGER LANGUAGE plpgsql AS $$ BEGIN IF (NEW.platz > (SELECT COUNT(*) FROM r_teilnahme t WHERE t.w_id = NEW.w_id AND t.platz IS NOT NULL ) ) THEN RAISE EXCEPTION 'Im Wettkampf % gibt es keine % Plätze.', (SELECT '"' || sa.name || ', ' || wa.name || ', ' || CASE WHEN geschlecht = 'w' THEN 'Frauen' ELSE 'Männer' END || '"' FROM e_wettkampf w JOIN enum_wettkampfart wa ON (w.wa_id = wa.id) JOIN enum_sportart sa ON (wa.sa_id = sa.id) WHERE w.id = NEW.w_id ), NEW.platz; END IF; RETURN NULL; END $$ ; CREATE CONSTRAINT TRIGGER platz_nicht_zu_gross_trigger AFTER INSERT OR UPDATE OR DELETE ON r_teilnahme DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE platz_nicht_zu_gross(); DROP TRIGGER IF EXISTS geschlecht_korrekt ON r_teilnahme; DROP FUNCTION IF EXISTS geschlecht_korrekt() CASCADE; CREATE FUNCTION geschlecht_korrekt() RETURNS TRIGGER LANGUAGE plpgsql AS $$ BEGIN IF NOT(((SELECT geschlecht FROM e_wettkampf w WHERE w.id = NEW.w_id) IN ('x', (SELECT geschlecht FROM e_sportler s WHERE s.id = NEW.s_id))) ) THEN RAISE EXCEPTION '% darf an % nicht teilnehmen (falsches Geschlecht).', (SELECT COALESCE(vorname || ' ' || name, name) || ' (' || TO_CHAR(geburtstag, 'DD.MM.YYYY') || ', ' || (SELECT kuerzel FROM e_sportler s JOIN enum_land l ON (s.l_id = l.id) WHERE s.id = NEW.s_id ) || ', ' || geschlecht || ')' FROM e_sportler WHERE id = NEW.s_id ), (SELECT '"' || sa.name || ', ' || wa.name || ', ' || CASE WHEN geschlecht = 'w' THEN 'Frauen' WHEN geschlecht = 'm' THEN 'Männer' ELSE 'Mixed' END || '"' FROM e_wettkampf w JOIN enum_wettkampfart wa ON (w.wa_id = wa.id) JOIN enum_sportart sa ON (wa.sa_id = sa.id) WHERE w.id = NEW.w_id ); END IF; RETURN NULL; END $$ ; CREATE CONSTRAINT TRIGGER geschlecht_korrekt AFTER INSERT OR UPDATE OR DELETE ON r_teilnahme DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE geschlecht_korrekt(); /***************************************************************************** * Views, um Tabellen ohne Kategorietabellen zu simulieren. *****************************************************************************/ CREATE VIEW sportler (id, name, vorname, geburtstag, land, geschlecht) AS SELECT s.id, s.name::VARCHAR, s.vorname::VARCHAR, s.geburtstag, l.kuerzel, s.geschlecht::CHAR FROM e_sportler s JOIN enum_land l ON (s.l_id = l.id) ; CREATE VIEW wettkampf (id, sportart, wettkampfart, geschlecht, sportstaette, beginn) AS SELECT w.id, sa.name::VARCHAR, wa.name::VARCHAR, w.geschlecht::CHAR, spst.name::VARCHAR, w.beginn FROM e_wettkampf w JOIN enum_wettkampfart wa ON (w.wa_id = wa.id) JOIN enum_sportart sa ON (wa.sa_id = sa.id) JOIN enum_sportstaette spst ON (w.spst_id = spst.id) ; CREATE VIEW teilnahme (s_id, w_id, platz, doping, disqualifiziert) AS SELECT s_id, w_id, platz, doping, disqualifiziert FROM r_teilnahme ; CREATE VIEW sportler_teilnahme (id, name, vorname, geburtstag, land, geschlecht, w_id, platz, doping, disqualifiziert ) AS SELECT s.id, s.name, s.vorname, s.geburtstag, s.land, s.geschlecht, t.w_id, t.platz, t.doping, t.disqualifiziert FROM sportler s JOIN teilnahme t ON (s.id = t.s_id) ; CREATE VIEW sportler_alle_teilnahme (id, name, vorname, geburtstag, land, geschlecht, w_id, platz, doping, disqualifiziert ) AS SELECT s.id, s.name, s.vorname, s.geburtstag, s.land, s.geschlecht, t.w_id, t.platz, t.doping, t.disqualifiziert FROM sportler s LEFT JOIN teilnahme t ON (s.id = t.s_id) ; CREATE VIEW wettkampf_teilnahme (id, sportart, wettkampfart, geschlecht, sportstaette, beginn, s_id, platz, doping, disqualifiziert ) AS SELECT w.id, w.sportart, w.wettkampfart, w.geschlecht, w.sportstaette, w.beginn, t.s_id, t.platz, t.doping, t.disqualifiziert FROM wettkampf w JOIN teilnahme t ON (t.w_id = w.id) ; CREATE VIEW wettkampf_alle_teilnahme (id, sportart, wettkampfart, geschlecht, sportstaette, beginn, s_id, platz, doping, disqualifiziert ) AS SELECT w.id, w.sportart, w.wettkampfart, w.geschlecht, w.sportstaette, w.beginn, t.s_id, t.platz, t.doping, t.disqualifiziert FROM wettkampf w LEFT JOIN teilnahme t ON (t.w_id = w.id) ; CREATE VIEW sportler_teilnahme_wettkampf (s_id, name, vorname, geburtstag, land, s_geschlecht, w_id, sportart, wettkampfart, w_geschlecht, sportstaette, beginn, platz, doping, disqualifiziert ) AS SELECT s.id, s.name, s.vorname, s.geburtstag, s.land, s.geschlecht, w.id, w.sportart, w.wettkampfart, w.geschlecht, w.sportstaette, w.beginn, t.platz, t.doping, t.disqualifiziert FROM sportler s JOIN teilnahme t ON (s.id = t.s_id) JOIN wettkampf w ON (t.w_id = w.id) ; CREATE VIEW sportler_alle_teilnahme_wettkampf (s_id, name, vorname, geburtstag, land, s_geschlecht, w_id, sportart, wettkampfart, w_geschlecht, sportstaette, beginn, platz, doping, disqualifiziert ) AS SELECT s.id, s.name, s.vorname, s.geburtstag, s.land, s.geschlecht, w.id, w.sportart, w.wettkampfart, w.geschlecht, w.sportstaette, w.beginn, t.platz, t.doping, t.disqualifiziert FROM sportler s LEFT JOIN teilnahme t ON (s.id = t.s_id) LEFT JOIN wettkampf w ON (t.w_id = w.id) ; CREATE VIEW sportler_teilnahme_wettkampf_alle (s_id, name, vorname, geburtstag, land, s_geschlecht, w_id, sportart, wettkampfart, w_geschlecht, sportstaette, beginn, platz, doping, disqualifiziert ) AS SELECT s.id, s.name, s.vorname, s.geburtstag, s.land, s.geschlecht, w.id, w.sportart, w.wettkampfart, w.geschlecht, w.sportstaette, w.beginn, t.platz, t.doping, t.disqualifiziert FROM sportler s RIGHT JOIN teilnahme t ON (s.id = t.s_id) RIGHT JOIN wettkampf w ON (t.w_id = w.id) ; CREATE VIEW sportler_alle_teilnahme_wettkampf_alle (s_id, name, vorname, geburtstag, land, s_geschlecht, w_id, sportart, wettkampfart, w_geschlecht, sportstaette, beginn, platz, doping, disqualifiziert ) AS SELECT t.s_id, s.name, s.vorname, s.geburtstag, s.land, s.geschlecht, t.w_id, w.sportart, w.wettkampfart, w.geschlecht, w.sportstaette, w.beginn, t.platz, t.doping, t.disqualifiziert FROM sportler s FULL JOIN teilnahme t ON (s.id = t.s_id) FULL JOIN wettkampf w ON (t.w_id = w.id) ; DROP RULE IF EXISTS delete_from_sportler ON sportler CASCADE; DROP RULE IF EXISTS update_sportler ON sportler CASCADE; DROP RULE IF EXISTS insert_into_sportler ON sportler CASCADE; CREATE RULE insert_into_sportler AS ON INSERT TO sportler DO INSTEAD INSERT INTO e_sportler (id, name, vorname, geburtstag, geschlecht, l_id) VALUES (NEW.id, NEW.name, NEW.vorname, NEW.geburtstag, NEW.geschlecht, (SELECT id FROM enum_land WHERE kuerzel = NEW.land) ); CREATE RULE update_sportler AS ON UPDATE TO sportler DO INSTEAD UPDATE e_sportler SET id = NEW.id, name = NEW.name, vorname = NEW.vorname, geburtstag = NEW.geburtstag, geschlecht = NEW.geschlecht, l_id = (SELECT id FROM enum_land WHERE kuerzel = NEW.land) WHERE id = OLD.id; CREATE RULE delete_from_sportler AS ON DELETE TO sportler DO INSTEAD DELETE FROM e_sportler WHERE id = OLD.id; DROP RULE IF EXISTS delete_from_wettkampf ON wettkampf CASCADE; DROP RULE IF EXISTS update_wettkampf ON wettkampf CASCADE; DROP RULE IF EXISTS insert_into_wettkampf ON wettkampf CASCADE; CREATE RULE insert_into_wettkampf AS ON INSERT TO wettkampf DO INSTEAD INSERT INTO e_wettkampf (id, wa_id, geschlecht, spst_id, beginn) VALUES (NEW.id, (SELECT wa.id FROM enum_wettkampfart wa JOIN enum_sportart sa ON (wa.sa_id = sa.id) WHERE wa.name = NEW.wettkampfart AND sa.name = NEW.sportart ), NEW.geschlecht, (SELECT id FROM enum_sportstaette WHERE name = NEW.sportstaette), NEW.beginn ); CREATE RULE update_wettkampf AS ON UPDATE TO wettkampf DO INSTEAD UPDATE e_wettkampf SET id = NEW.id, wa_id = (SELECT wa.id FROM enum_wettkampfart wa JOIN enum_sportart sa ON (wa.sa_id = sa.id) WHERE wa.name = NEW.wettkampfart AND sa.name = NEW.sportart ), geschlecht = NEW.geschlecht, spst_id = (SELECT id FROM enum_sportstaette WHERE name = NEW.sportstaette), beginn = NEW.beginn WHERE id = OLD.id; CREATE RULE delete_from_wettkampf AS ON DELETE TO wettkampf DO INSTEAD DELETE FROM e_wettkampf WHERE id = OLD.id; DROP RULE IF EXISTS delete_from_teilnahme ON teilnahme CASCADE; DROP RULE IF EXISTS update_teilnahme ON teilnahme CASCADE; DROP RULE IF EXISTS insert_into_teilnahme ON teilnahme CASCADE; CREATE RULE insert_into_teilnahme AS ON INSERT TO teilnahme DO INSTEAD INSERT INTO r_teilnahme (s_id, w_id, platz, doping, disqualifiziert) VALUES (NEW.s_id, NEW.w_id, NEW.platz, NEW.doping, COALESCE(NEW.disqualifiziert, FALSE)) ; CREATE RULE update_teilnahme AS ON UPDATE TO teilnahme DO INSTEAD UPDATE r_teilnahme SET s_id = NEW.s_id, w_id = NEW.w_id, platz = NEW.platz, doping = NEW.doping, disqualifiziert = COALESCE(NEW.disqualifiziert, FALSE) WHERE s_id = OLD.s_id AND w_id = OLD.w_id; CREATE RULE delete_from_teilnahme AS ON DELETE TO teilnahme DO INSTEAD DELETE FROM r_teilnahme WHERE s_id = OLD.s_id AND w_id = OLD.w_id; /***************************************************************************** * Beispielsdaten *****************************************************************************/ INSERT INTO enum_sportart(id, name) VALUES (1, 'Judo'), (2, 'Schwimmen'), (3, 'Rudern'), (4, 'Boxen'), (5, 'Tennis') ; INSERT INTO enum_wettkampfart(id, sa_id, name) VALUES (1, 1, 'bis 57kg'), (2, 1, 'bis 80kg'), (3, 2, 'Lagen 400m'), (4, 2, 'Schmetterling 100m'), (5, 2, 'Brust 100m'), (6, 2, 'Brust 200m'), (7, 3, 'Kajak-Einer'), (8, 4, 'bis 57kg'), (9, 4, 'bis 80kg'), (10, 5, 'Einzel Finale'), (11, 5, 'Mixed Finale') ; INSERT INTO enum_sportstaette(id, name) VALUES (1, 'Halle 1'), (2, 'Halle 2'), (3, 'Schwimmhalle 1'), (4, 'Schwimmhalle 2'), (5, 'Ruderstrecke'), (6, 'Center Court') ; INSERT INTO enum_land(id, kuerzel, name_de, name_en, name_fr) VALUES (1, 'BLR', 'Weißrußland', 'Belarus', 'Biélorussie'), (2, 'CUB', 'Kuba', 'Cuba', 'Cuba'), (3, 'FRA', 'Frankreich', 'France', 'France'), (4, 'GER', 'Bundesrepublik Deutschland', 'Federal Republic of Germany', 'République fédérale d’Allemagne'), (5, 'GRE', 'Griechenland', 'Greece', 'Grèce'), (6, 'ITA', 'Italien', 'Italy', 'Italie'), (7, 'RUS', 'Russische Föderation', 'Russian Federation', 'Fédération de Russie ') ; INSERT INTO sportler(id, name, vorname, geburtstag, geschlecht, land) VALUES (1, 'Völker', 'Sandra', DATE '1974-04-01', 'w', 'GER'), (2, 'van Almsick', 'Franziska', DATE '1978-04-05', 'w', 'GER'), (3, 'Harstick', 'Sara', DATE '1981-01-01', 'w', 'GER'), (4, 'Buschschulte', 'Antje', DATE '1978-12-27', 'w', 'GER'), (5, 'Filippi', 'Alessia', DATE '1987-06-23', 'w', 'ITA'), (6, 'Angelopoulou', 'Vasiliki', DATE '1987-05-30', 'w', 'GRE'), (7, 'Rutschow-Stomporowski', 'Katrin', DATE '1975-04-02', 'w', 'GER'), (8, 'Karsten', 'Ekaterina', DATE '1972-06-02', 'w', 'BLR'), (9, 'Fedotova', 'Irina', DATE '1970-01-01', 'w', 'RUS'), (10, 'Boenisch', 'Yvonne', DATE '1980-12-29', 'w', 'GER'), (11, 'Yukhareva', 'Natalya', DATE '1970-01-01', 'w', 'RUS'), (12, 'Cavazzuti', 'Cinzia', DATE '1970-01-01', 'w', 'ITA'), (13, 'Harel', 'Barbara', DATE '1970-01-01', 'w', 'FRA'), (14, 'Xeteylu', 'Leidisyuri', DATE '1970-01-01', 'w', 'CUB'), (15, 'Tuuxaru', 'Iliisquix', DATE '1970-01-01', 'm', 'CUB'), (16, 'Maier', 'Josef', DATE '1980-01-01', 'm', 'GER'), (17, 'Maier', 'Josef', DATE '1982-01-01', 'm', 'GER'), (18, 'Dede', NULL, DATE '1970-01-01', 'm', 'GER'), (19, 'Graf', 'Steffi', DATE '1969-06-14', 'w', 'GER'), (20, 'Becker', 'Boris', DATE '1967-11-22', 'm', 'GER') ; INSERT INTO wettkampf(id, sportart, wettkampfart, geschlecht, sportstaette, beginn) VALUES ( 1, 'Judo', 'bis 57kg', 'w', 'Halle 1', TIMESTAMP '2004-08-14 16:30'), ( 2, 'Judo', 'bis 80kg', 'm', 'Halle 2', TIMESTAMP '2004-08-14 16:30'), ( 3, 'Schwimmen', 'Lagen 400m', 'w', 'Schwimmhalle 1', TIMESTAMP '2004-08-14 17:30'), ( 4, 'Schwimmen', 'Schmetterling 100m', 'w', 'Schwimmhalle 1', TIMESTAMP '2004-08-15 15:30'), ( 5, 'Schwimmen', 'Brust 100m', 'w', 'Schwimmhalle 2', TIMESTAMP '2004-08-16 12:15'), ( 6, 'Schwimmen', 'Brust 100m', 'm', 'Schwimmhalle 2', TIMESTAMP '2004-08-16 14:15'), ( 7, 'Schwimmen', 'Brust 200m', 'w', 'Schwimmhalle 1', TIMESTAMP '2004-08-17 12:15'), ( 8, 'Schwimmen', 'Brust 200m', 'm', 'Schwimmhalle 1', TIMESTAMP '2004-08-17 14:15'), ( 9, 'Rudern', 'Kajak-Einer', 'w', 'Ruderstrecke', TIMESTAMP '2004-08-19 19:30'), (10, 'Rudern', 'Kajak-Einer', 'm', 'Ruderstrecke', TIMESTAMP '2004-08-19 19:30'), (11, 'Boxen', 'bis 57kg', 'w', 'Halle 1', TIMESTAMP '2004-08-17 16:30'), (12, 'Boxen', 'bis 80kg', 'm', 'Halle 2', TIMESTAMP '2004-08-17 16:30'), (13, 'Tennis', 'Einzel Finale', 'w', 'Center Court', TIMESTAMP '2004-08-20 20:00'), (14, 'Tennis', 'Einzel Finale', 'm', 'Center Court', TIMESTAMP '2004-08-21 20:00'), (15, 'Tennis', 'Mixed Finale', 'x', 'Center Court', TIMESTAMP '2004-08-22 20:00') ; INSERT INTO teilnahme (s_id, w_id, platz, doping) VALUES ( 1, 3, 1, FALSE), ( 1, 4, 1, FALSE), ( 1, 5, 1, FALSE), ( 1, 7, 1, FALSE), ( 2, 3, 2, NULL), ( 2, 5, 8, FALSE), ( 2, 9, 1, NULL), ( 3, 3, 1, NULL), ( 4, 3, 1, FALSE), ( 4, 4, 1, FALSE), ( 4, 5, 2, FALSE), ( 5, 3, 1, FALSE), ( 5, 5, 2, FALSE), ( 6, 5, 1, FALSE), ( 8, 5, 1, FALSE), (11, 5, 1, FALSE), (13, 5, 2, FALSE), (13, 4, NULL, FALSE), (16, 10, NULL, FALSE), (19, 13, 1, FALSE), (20, 14, 1, FALSE), (19, 15, 1, FALSE), (20, 15, 1, FALSE) ; INSERT INTO teilnahme (s_id, w_id, platz, doping, disqualifiziert) VALUES (14, 5, NULL, TRUE, TRUE), (15, 6, NULL, TRUE, TRUE), (17, 6, NULL, FALSE, TRUE) ; /* -- Check constraints report errors INSERT INTO teilnahme (s_id, w_id, platz) VALUES (10, 5, 0); INSERT INTO teilnahme (s_id, w_id, platz, doping) VALUES (10, 5, 9, TRUE); INSERT INTO teilnahme (s_id, w_id, platz, doping, disqualifiziert) VALUES (10, 5, NULL, TRUE, FALSE); INSERT INTO teilnahme (s_id, w_id, platz, doping, disqualifiziert) VALUES (10, 5, 9, TRUE, TRUE); */ /* -- Check constraints report errors INSERT INTO r_teilnahme (s_id, w_id, platz) VALUES (10, 5, 0); INSERT INTO r_teilnahme (s_id, w_id, platz, doping) VALUES (10, 5, 9, TRUE); INSERT INTO r_teilnahme (s_id, w_id, platz, doping, disqualifiziert) VALUES (10, 5, NULL, TRUE, FALSE); INSERT INTO r_teilnahme (s_id, w_id, platz, doping, disqualifiziert) VALUES (10, 5, 9, TRUE, TRUE); INSERT INTO r_teilnahme (s_id, w_id, platz, doping) VALUES ( 7, 5, 11, FALSE); INSERT INTO r_teilnahme (s_id, w_id, platz, doping) VALUES (18, 5, 9, FALSE); INSERT INTO r_teilnahme (s_id, w_id, platz, doping) VALUES (19, 14, 1, FALSE); INSERT INTO r_teilnahme (s_id, w_id, platz, doping) VALUES (20, 13, 1, FALSE); */