Postgresql 使用触发器后-错误:列“中的空值”;组“U id”;违反非空约束

Postgresql 使用触发器后-错误:列“中的空值”;组“U id”;违反非空约束,postgresql,triggers,notnull,Postgresql,Triggers,Notnull,我正在x86_64-redhat-linux-gnu上使用PostgreSQL 8.1.23 我必须写一个数据库来预订语言课程的座位,并且有一个要求,那就是应该有一个触发器,它将检查我们试图写入新组的lector是否同时有其他组。我有这样的表格: CREATE TABLE groups ( group_id serial PRIMARY KEY, lang varchar(3) NOT NULL, level varchar(3), seats int4, lector int4, s

我正在x86_64-redhat-linux-gnu上使用PostgreSQL 8.1.23

我必须写一个数据库来预订语言课程的座位,并且有一个要求,那就是应该有一个触发器,它将检查我们试图写入新组的lector是否同时有其他组。我有这样的表格:

CREATE TABLE groups (
group_id serial PRIMARY KEY, 
lang varchar(3) NOT NULL, 
level varchar(3), 
seats int4, 
lector int4, 
start time,
day varchar(3),
FOREIGN KEY (language) REFERENCES languages(lang) ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (lector) REFERENCES lectors(lector_id) ON UPDATE CASCADE ON DELETE SET NULL);
而这种触发:

CREATE FUNCTION if_available () RETURNS trigger AS '
DECLARE
r groups%rowtype;
c groups%rowtype;
BEGIN
FOR r IN SELECT * FROM groups WHERE r.lector=NEW.lector ORDER BY group_id LOOP
    IF (r.start = NEW.start AND r.day = NEW.day) THEN
        RAISE NOTICE ''Lector already has a group at this time!'';
        c = NULL;
        EXIT;
    ELSE
        c = NEW;
    END IF;
END LOOP;
RETURN c;
END;
' LANGUAGE 'plpgsql';
CREATE TRIGGER if_available_t 
BEFORE INSERT OR UPDATE ON grupy
FOR EACH ROW EXECUTE PROCEDURE if_available(); 
将新行插入表
后,例如:

INSERT groups (lang, level, seats, lector, start, day) values ('ger','A-2',12,2,'11:45','wed');
我得到一个类似这样的错误:

ERROR:  null value in column "group_id" violates not-null constraint

没有这个触发器,一切都好。有人能帮我怎么做吗?

最后,我解决了它!
BEGIN
之后应该有
c=NEW
,因为当表
groups
开始时为空时,FOR循环不会运行,并返回
NULL
。我还更改了FOR循环中的条件:
…其中lector=NEW.lector…
。最后,我更改了IF for
IF(r.group\u id NEW.group\u id和r.start=NEW.start和r.day=NEW.day)中的条件,然后…
,因为我不想在一次特定更新之前运行此触发器。也许这会对某人有所帮助:)