2016-06-06 11 views
0

Hier ist mein Code im Moment:PostgreSQL Einschränkungen - Daten prüfen und einige regex

CREATE TABLE sektors (
id_sektors SERIAL PRIMARY KEY, 
laukuma_nosaukums varchar(100) UNIQUE, 
m2 int CHECK(m2 ~ '^[^0-9]*$') 
datums_no date CHECK(datums_no XXX???), 
datums_lidz date CHECK(datums_lidz XXX???), 
id_koka_veds int NOT NULL REFERENCES koku_veids(id_veids), 
id_audzesanas_veids int NOT NULL REFERENCES audzesanas_veids(id_audzesanas_veids), 
id_senu_veids int NOT NULL REFERENCES senu_veids(id_senu_veids) 
); 

Was ich erreichen möchte:

laukuma_nosaukums - Einträge nur einmalig enthalten

m2 - können nur Zahlen enthalten? Weiß nicht, ob das stimmt.

datums_no - Ich weiß nicht, wie ich es schreiben soll, aber ich möchte es so: Ich kann nur Datum eingeben, das älter als das aktuelle Datum ist.

datums_lidz - Weiß ich auch nicht. Ich möchte es so: Ich kann nur ein Datum eingeben, das NICHT älter als 3 Monate vom aktuellen Datum ist.

+0

Der ganze Sinn der Verwendung des entsprechenden Datentyps ** ist **, um unzulässige Werte für diesen Datentyp zu verhindern. Eine 'int'-Spalte kann ** nur ** Zahlen speichern, es ist also nicht notwendig, eine Prüfbedingung zu verwenden. Plus: 'regex' ist für Strings, nicht für Zahlen. –

+0

Oh sry, ich habe es. Kannst du mir mit Dates helfen? Auch, macht diese Regex: (\ d {6}) \ - (\ d {5}) die Sache für XXXXXX-XXXXX, wobei X die Nummer ist? –

+0

Gültige Zahlen dürfen kein '-' in der Mitte haben. –

Antwort

0

Dies sollte tun, was Sie für Ihre Datumsfelder benötigen. Wichtig: Verwenden Sie current_date und nicht now(). Ersteres ist eine spezielle Systemvariable. Letzteres wird beim Erstellen der Tabelle ausgewertet, was zu Fehlern führt, sobald sich das Datum ändert.

+0

'now()' und 'current_date' machen überhaupt keinen Unterschied. Beide werden nur beim Einfügen oder Aktualisieren der Zeile ausgewertet. (Tatsächlich ist 'aktuelles_datum' nur ein Synonym für' now() :: date' –

Verwandte Themen