如果列中存在某个值,则防止用空值覆盖sql

6jjcrrmo  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(342)

我试图找出达到某种限制的最佳方法。约束条件是,如果列中已经存在一个非null值,我需要防止它被null值更新。它应该仍然可以接受非空的更新。如果在已经存在非null值的列上针对该约束运行null更新,我需要防止这种情况
示例->
列名:lname

> t0: Lname = NULL
> t1: update Lname - > Dracula (ALLOWED)
> t2: update Lname - > daniel (ALLOWED)
> t3: update Lname - > NULL  (DISALLOW THIS)
> t4: Final state Lname -> daniel (FINAL STATE)

我可以考虑通过编程的方式从db中获取行,并将当前值与传入值进行比较。但我想知道是否有更好的解决办法。
notnull约束将不起作用,因为当第一次创建行时,它可以在这些列中携带null值。
当前正在使用带有typeorm的postgres。
如果您有任何想法/建议,我们将不胜感激!

hgtggwj0

hgtggwj01#

你不能用约束来做。
最好的办法就是扣动扳机。可能是这样的:

CREATE FUNCTION no_set_null() RETURNS trigger
   LANGUAGE plpgsql AS
$$BEGIN
   IF OLD.col1 IS NOT NULL AND NEW.col1 IS NULL THEN
      RAISE EXCEPTION 'cannot change "col1" to NULL';
   END IF;

   IF OLD.col2 IS NOT NULL AND NEW.col2 IS NULL THEN
      RAISE EXCEPTION 'cannot change "col2" to NULL';
   END IF;

   ...

   RETURN NEW;
END;$$;

CREATE TRIGGER no_set_null BEFORE UPDATE ON atable
   FOR EACH ROW EXECUTE PROCEDURE no_set_null();

您也可以为它提供一个通用的触发器函数,但是它会很复杂,而且性能可能不会那么好。

pzfprimi

pzfprimi2#

另一个可能的选择是编写一个plpgsql过程来执行更新,并强制应用程序使用该过程。您可以从应用程序用户撤消对表的更新,因此更新表的唯一方法是通过以下过程。

相关问题