diff --git a/sql/create.sql b/sql/create.sql index a94feb3..17cdeab 100644 --- a/sql/create.sql +++ b/sql/create.sql @@ -1,11 +1,13 @@ +PRAGMA foreign_keys = ON; + CREATE TABLE country ( - alpha2 TEXT NOT NULL CHECK(LENGTH(alpha2) = 2), - alpha3 TEXT NOT NULL CHECK(LENGTH(alpha3) = 3), - num INTEGER NOT NULL CHECK(num >= 0), + alpha2 TEXT NOT NULL CHECK (alpha2 REGEXP '[A-Z]{2}'), + alpha3 TEXT NOT NULL CHECK (alpha3 REGEXP '[A-Z]{3}'), + num INTEGER NOT NULL CHECK (num >= 0), name TEXT NOT NULL, - is_visible INTEGER NOT NULL CHECK(is_visible = TRUE OR is_visible = FALSE) DEFAULT TRUE, + is_visible INTEGER NOT NULL CHECK (is_visible = TRUE OR is_visible = FALSE) DEFAULT TRUE, CONSTRAINT pk_country PRIMARY KEY (alpha2), CONSTRAINT sk_country_alpha3 UNIQUE (alpha3), @@ -14,7 +16,7 @@ CREATE TABLE country ( ) STRICT; CREATE TABLE currency ( - code TEXT NOT NULL CHECK(LENGTH(code) = 3), + code TEXT NOT NULL CHECK (code REGEXP '[A-Z]{3}'), name TEXT NOT NULL, symbol TEXT, @@ -24,8 +26,8 @@ CREATE TABLE currency ( ) STRICT; CREATE TABLE wine_variety ( - code TEXT NOT NULL CHECK(LENGTH(code) = 2), - type TEXT NOT NULL CHECK(type IN ('R', 'W')), + code TEXT NOT NULL CHECK (code REGEXP '[A-Z]{2}'), + type TEXT NOT NULL CHECK (type IN ('R', 'W')), name TEXT NOT NULL, comment TEXT, @@ -33,7 +35,7 @@ CREATE TABLE wine_variety ( ) STRICT; CREATE TABLE AT_bundesland ( - id INTEGER NOT NULL CHECK(id >= 0), + id INTEGER NOT NULL CHECK (id >= 0), short1 TEXT NOT NULL, short2 TEXT, name TEXT NOT NULL, @@ -44,32 +46,43 @@ CREATE TABLE AT_bundesland ( CONSTRAINT sk_AT_bundesland_name UNIQUE (name) ) STRICT; -CREATE TABLE AT_gemeinde ( - gkz INTEGER NOT NULL CHECK(gkz >= 10000 AND gkz <= 99999), - land_id INTEGER NOT NULL CHECK(land_id = gkz / 10000), +CREATE TABLE AT_gem ( + gkz INTEGER NOT NULL CHECK (gkz >= 10000 AND gkz <= 99999), + land_id INTEGER NOT NULL GENERATED ALWAYS AS (gkz / 10000) VIRTUAL, name TEXT NOT NULL, - CONSTRAINT pk_AT_gemeinde PRIMARY KEY (gkz), - CONSTRAINT fk_AT_gemeinde_AT_bundesland FOREIGN KEY (land_id) REFERENCES AT_bundesland (id) + CONSTRAINT pk_AT_gem PRIMARY KEY (gkz), + CONSTRAINT fk_AT_gem_AT_bundesland FOREIGN KEY (land_id) REFERENCES AT_bundesland (id) + ON UPDATE CASCADE + ON DELETE RESTRICT +) STRICT; + +CREATE TABLE AT_kg ( + kgnr INTEGER NOT NULL CHECK (kgnr > 0 AND kgnr < 100000), + gkz INTEGER NOT NULL, + name TEXT NOT NULL, + + CONSTRAINT pk_AT_kg PRIMARY KEY (kgnr), + CONSTRAINT fk_AT_kg_AT_gem FOREIGN KEY (gkz) REFERENCES AT_gem (gkz) ON UPDATE CASCADE ON DELETE RESTRICT ) STRICT; CREATE TABLE AT_ort ( - okz INTEGER NOT NULL CHECK(okz > 0), - gkz INTEGER NOT NULL, + okz INTEGER NOT NULL CHECK (okz > 0 AND okz < 100000), + kgnr INTEGER NOT NULL, name TEXT NOT NULL, CONSTRAINT pk_AT_ort PRIMARY KEY (okz), - CONSTRAINT fk_AT_ort_AT_gemeinde FOREIGN KEY (gkz) REFERENCES AT_gemeinde (gkz) + CONSTRAINT fk_AT_ort_AT_kg FOREIGN KEY (kgnr) REFERENCES AT_kg (kgnr) ON UPDATE CASCADE ON DELETE RESTRICT ) STRICT; CREATE TABLE AT_plz ( - plz INTEGER NOT NULL CHECK(plz >= 1000 AND plz <= 9999), + plz INTEGER NOT NULL CHECK (plz >= 1000 AND plz <= 9999), okz INTEGER NOT NULL, - id INTEGER NOT NULL CHECK(id = plz * 100000 + okz), + id INTEGER NOT NULL GENERATED ALWAYS AS (plz * 100000 + okz) STORED, name TEXT NOT NULL, CONSTRAINT pk_AT_plz PRIMARY KEY (plz, okz), @@ -80,7 +93,7 @@ CREATE TABLE AT_plz ( ) STRICT; CREATE TABLE origin ( - code TEXT NOT NULL CHECK(LENGTH(code) = 4), + code TEXT NOT NULL CHECK (code REGEXP '[A-Z]{4}'), parent_code TEXT, name TEXT NOT NULL,