PostgreSQL: leeg DATE veld
Als je in MySQL een lege string in een DATE veld stopt krijg je geen klachten. PostgreSQL geeft dan een foutmelding. Op zich logisch, want een lege string is geen geldige datumwaarde.
Het komt echter wel voor dat je nog niet weet welke waarde een veld moet gaan bevatten en hem (voorlopig) leeg wilt laten. Na wat testen kwam ik erachter dat Postgre dit wel slikt:
Na wat Googlen kwam ik er achter dat dit weer problemen op kan gaan leveren met JOINS en aggregate functies. Het enige dat me op dit moment te binnen schiet is een foreign key maken naar een aparte tabel met datums. Heeft iemand hier ervaring mee?
Het komt echter wel voor dat je nog niet weet welke waarde een veld moet gaan bevatten en hem (voorlopig) leeg wilt laten. Na wat testen kwam ik erachter dat Postgre dit wel slikt:
Na wat Googlen kwam ik er achter dat dit weer problemen op kan gaan leveren met JOINS en aggregate functies. Het enige dat me op dit moment te binnen schiet is een foreign key maken naar een aparte tabel met datums. Heeft iemand hier ervaring mee?
Gesponsorde koppelingen:
Zolang je niet op datums gaat joinen is er toch niet zo'n probleem?
Of zie ik dit verkeert?
Of zie ik dit verkeert?
Ik kan me voorstellen dat je op datums gaat groeperen?
Jan ik snap het probleem niet. Bij mij werkt onderstaand prima. Uiteraard is de voorwaarde wel dat je het DATE veld niet de NOT NULL CONSTRAINT gegeven hebt.
Groeten
Klaasjan
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE "public"."blaat" (
"Blaat" DATE,
"Onzin" VARCHAR(100)
) WITH OIDS
TABLESPACE "pg_default";
INSERT INTO
public.blaat(
"Onzin")
VALUES('tekst')
Query OK, 1 rows affected (171 ms)
"Blaat" DATE,
"Onzin" VARCHAR(100)
) WITH OIDS
TABLESPACE "pg_default";
INSERT INTO
public.blaat(
"Onzin")
VALUES('tekst')
Query OK, 1 rows affected (171 ms)
Groeten
Klaasjan
Die not null constraint zit er bij mij uiteraard ook op. Maar in jouw voorbeeld laat je gewoon het datumveld weg uit de insert query. Ik vraag me af welke waarde er dan in de DATE kolom terecht komt.
Edit: die not null constraint zat er niet op, anders had ik die null ook niet kunnen invoeren natuurlijk. Kijken of dat nog iets uitmaakt.
Edit: die not null constraint zat er niet op, anders had ik die null ook niet kunnen invoeren natuurlijk. Kijken of dat nog iets uitmaakt.
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
Jan dan komt er null in de DB te staan en blijkbaar zijn we dan weer terug bij af....
Klopt. Blijft de vraag of dat problemen gaat opleveren met joins en aggregate functies.
Aan wat voor problemen zou je dan moeten denken? Ik kan het me haast niet voorstellen.
Bij joinen lijkt me echt alleen op het moment dat je gaat joinen op een datum kolom.
Bij aggregate functies is het zeer waarschijnlijk dat als je bijvoorbeeld een distinct count op een datum kolom uitvoert alle NULL waarden als 1 geteld worden.
Overigens vind ik het wel weer typisch dat je in MySQL een lege string als datum op kan geven.
Bij joinen lijkt me echt alleen op het moment dat je gaat joinen op een datum kolom.
Bij aggregate functies is het zeer waarschijnlijk dat als je bijvoorbeeld een distinct count op een datum kolom uitvoert alle NULL waarden als 1 geteld worden.
Overigens vind ik het wel weer typisch dat je in MySQL een lege string als datum op kan geven.
NULL, het ontbreken van een waarde, is toch niets bijzonders? Dat dit niet kan in MySQL (met een datum), zegt meer over MySQL dan over deze mogelijkheid. Andere databases ondersteunen dit ook gewoon.
Wanneer jij wilt joinen op een datum, vind het bijzonder maar het kan, dan zit je met exact dezelfde regels als het joinen op een id die niet verplicht is. Wanneer je een NULL mag opslaan, dan is dat volgens de door jou opgestelde regels. Agregate functies hebben er geen problemen mee, die hebben daar dagelijks mee te maken, en voor joins geldt dit eveneens. Zie de verschillen tussen een INNER, LEFT, RIGHT en OUTER join.
Wanneer jij wilt joinen op een datum, vind het bijzonder maar het kan, dan zit je met exact dezelfde regels als het joinen op een id die niet verplicht is. Wanneer je een NULL mag opslaan, dan is dat volgens de door jou opgestelde regels. Agregate functies hebben er geen problemen mee, die hebben daar dagelijks mee te maken, en voor joins geldt dit eveneens. Zie de verschillen tussen een INNER, LEFT, RIGHT en OUTER join.



