Както @Pavel предостави, проверката <row-type> IS NOT NULL не работи така, както изглежда очаквате. Връща TRUE ако (и само ако) всяка отделна колона е NOT NULL .
Тествайте специалната променлива FOUND вместо това (като @Mike коментира):
CREATE OR REPLACE FUNCTION registration(wr text)
RETURNS integer AS
$rL$
...
SELECT * INTO rowt FROM email WHERE email_email = eml;
IF FOUND THEN
RAISE EXCEPTION 'email address, %, already registered.', eml;
END IF;
...
$rL$ LANGUAGE plpgsql; Или можете да обърнете израза си в теста.
IF rowt IS NULL THEN
-- do nothing
ELSE
RAISE EXCEPTION 'email address, %, already registered.' , eml;
END IF;
Всеки съществуващ ред, който бихте намерили, съдържа поне една колона, която е NOT NULL , следователно rowt IS NULL връща само TRUE ако не се намери нищо.
Свързани отговори с повече подробности:
- IS NOT NULL тестът за запис не връща TRUE, когато е зададена променлива
- Ограничение НЕ NULL върху набор от колони