Ik zie twee mogelijke redenen, waarom ...
Geen van deze verhogingen verschijnt in mijn berichtenlogboek
Niet ingelogd
Ten eerste een NOTICE
wordt normaal gesproken niet naar het databaselogboek geschreven met standaardinstellingen. Ik citeer hier de handleiding:
log_min_messages
(enum
)Bepaalt welke berichtniveaus naar het serverlogboek worden geschreven. Geldige waarden zijn
DEBUG5
,DEBUG4
,DEBUG3
,DEBUG2
,DEBUG1
,INFO
,NOTICE
,WARNING
,ERROR
,LOG
,FATAL
, enPANIC
. (...)
De standaard is WAARSCHUWING . Merk op datLOG
heeft hier een andere rang dan inclient_min_messages
.
Vetgedrukte nadruk van mij. Let ook op de verschillende standaard (NOTICE
) voor client_min_messages
(vorig item in de handleiding).
Ongeldige test
Ten tweede, overweeg hoe een rij-expressie wordt geëvalueerd. Een test row_variable IS NULL
retourneert TRUE
als (en alleen als) elk afzonderlijk element is NULL
. Gegeven het volgende voorbeeld:
SELECT (1, NULL) IS NULL AS a -- FALSE
,(1, NULL) IS NOT NULL AS b -- also FALSE
Beide expressies retourneren FALSE
. Met andere woorden, een rij (of record) variabele (1, NULL)
is geen van beide NULL
, noch is het NOT NULL
. Daarom mislukken uw beide tests.
-> SQLfiddle met meer details.
Meer details, uitleg, links en een mogelijke toepassing voor dit gedrag in een CHECK
beperking in dit gerelateerde antwoord:
NOT NULL beperking over een reeks kolommen
U kunt zelfs een recordvariabele toewijzen met NULL (rec := NULL
), wat ertoe leidt dat elk element NULL is - als het type een bekend rijtype is. Anders hebben we te maken met een anoniem record en is de structuur niet gedefinieerd en heeft u om te beginnen geen toegang tot elementen. Maar dat is niet het geval met een rowtype
zoals in jouw voorbeeld (wat altijd bekend is).
Oplossing:FOUND
Wat is de juiste manier om te testen of je een rij hebt ontvangen van een
SELECT * INTO
?
U moet er rekening mee houden dat de rij NULL kan zijn, zelfs als deze is toegewezen. De query zou heel goed een aantal NULL-waarden kunnen hebben geretourneerd (als de tabeldefinitie in uw query NULL-waarden toestaat). Zo'n test zou per definitie onbetrouwbaar zijn.
Er is een eenvoudige en veilige aanpak. Gebruik GET DIAGNOSTICS ...
of (indien van toepassing) de speciale variabele FOUND
:
SELECT * FROM my_table WHERE owner_id = 6 INTO my_var;
IF NOT FOUND THEN
RAISE NOTICE 'Query did not return a row!';
END IF;
Details in de handleiding.