当前位置: 首页 > 知识库问答 >
问题:

为什么在Postgres空表中,如果我使用BEFORE INSERT,则:new:变量为NULL?

柴浩大
2023-03-14

我正在用PostgreSQL开发一个电影数据库。我有一个触发器,在我插入一个新的节目之前,它会检查节目的日期是否早于电影的发行日期(例如,今天添加了一个阿凡达2的节目)。以下是代码:

CREATE TRIGGER beforereleasedate
    BEFORE INSERT
    ON public.shows
    FOR EACH ROW
    EXECUTE PROCEDURE public.filmnotreleased();



CREATE FUNCTION public.filmnotreleased()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
DECLARE

var1 DATE;
var2 DATE;

BEGIN 

SELECT NEW.ShowDate INTO var1
FROM SHOWS;

SELECT ReleaseDate INTO var2
FROM FILM
WHERE CodF=NEW.CodF;

IF var1<var2 
THEN 
RAISE EXCEPTION 'Can't add a show of a movie still not released.';
END IF;

RETURN NEW;
END;
$BODY$;

ALTER FUNCTION public.filmnotreleased()
    OWNER TO postgres;

问题是,如果SHOWS表为空,var1为空。已通过“加薪通知”进行检查。奇怪的是,只有当表为空时才会发生这种情况。所以,无论我使用什么日期,第一次插入都是错误的。之后,触发器正常工作,var1不再为NULL,而是具有我刚刚插入的值。

有什么帮助吗?

共有1个答案

匡晟
2023-03-14

部分:选择新建。ShowDate从SHOWS进入var1 毫无意义。为了将一个变量(new.showdate)的值存储到另一个变量(var1)中,您正在读取表shows中的所有行。显然,如果表为空,SELECT不会返回任何行,这意味着var1将为空。

但是不需要从表中读取任何内容,因为您可以通过new记录访问当前插入的行。

所以你可能想要这样的东西:

CREATE FUNCTION public.filmnonuscito()
    RETURNS trigger
    LANGUAGE plpgsql
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
DECLARE
  var2 DATE;
BEGIN 

  SELECT ReleaseDate 
     INTO var2
  FROM FILM
  WHERE CodF=NEW.CodF;

  IF NEW.showdate < var2 
  THEN 
    RAISE EXCEPTION 'Can't add a show of a movie still not released.';
  END IF;

  RETURN NEW;
END;
$BODY$;

请注意,如果根本没有这样的电影,这并不能处理这种情况。您可能需要添加一个null检查来处理这个问题,例如if NEW. show date

 类似资料:
  • 问题内容: 在某些地方,我看到了语法,其中用名称初始化变量,有时不使用名称初始化。例如: 命名变量有 什么意义? 问题答案: 该参数是可选的(可以创建带有或不带有它的变量和常量),并且在程序中使用的变量不依赖于它。名称在两个地方可能会有所帮助: 当您想要保存或还原变量时 (可以在计算后将它们保存到二进制文件中)。从文档: 默认情况下,它为每个变量使用Variable.name属性的值 但是你有变量

  • 问题内容: 简介文档中有很多段落专门介绍了和之间的区别,但是实际上,您可以在本地范围内创建对象并将其返回。 为什么要使用一对分配器? 问题答案: 您可以做的事情,您无法做其他任何事情: 建立频道 创建一个预先分配了空间的地图 创建具有预分配空间或len!= cap的切片 证明有一点困难。使它变得更容易的主要事情是创建指向非复合类型的指针。以下两个功能是等效的。简而言之:

  • 我经常看到函数或方法返回Result 换句话说,这种返回不会返回任何内容或错误。为什么使用会导致这种情况,而不是一种选择?我认为这个选项更合适,因为在我们的示例中,它实际上不返回任何值或值——无或错误。

  • 这个程序要求我写一个程序,要求用户键入两个数字x,y,和一个算术符号s。根据输入的符号,程序将两个数字相加或相减,并使用带有三个参数的返回类型方法返回结果。 示例:如果输入是2、3和'+'。然后,程序将打印:5 这就是我所做的; 但我无法在不知道为什么的if命令中获取(char1)

  • 我正在使用VS2022,。NET 6,C#10,在项目范围内启用了可为空上下文。 变量正在解析为可为空的类型

  • 到目前为止,我得到了indexOutOfBoundsException错误