PostgreSQL – 根据另一个单元格值设置默认单元格值

如果我有一个列表示任何给定值的列a,并且我想要另一个列列b根据列a的值具有认值

换句话说:
如果列a =’peter’,则列b认值=’doctor’.

这是不可能的简单的一个DEFAULT值,如 the manual clearly states

The value is any variable-free expression (subqueries and
cross-references to other columns in the current table are not allowed).

您可以使用trigger

CREATE OR REPLACE FUNCTION trg_foo_b_default()
  RETURNS trigger AS
$func$
BEGIN

-- For just a few constant options,CASE does the job:
NEW.b :=
   CASE NEW.a
    WHEN 'peter'  THEN 'doctor'
    WHEN 'weirdo' THEN 'shrink'
    WHEN 'django' THEN 'undertaker'
    ELSE NULL
   END;

/* -- For more,or dynamic options,you Could use a lookup table:
SELECT INTO NEW.b  t.b
FROM   def_tbl t
WHERE  t.a = NEW.a;
*/

RETURN NEW;

END
$func$LANGUAGE plpgsql;

CREATE TRIGGER b_default
BEFORE INSERT ON foo
FOR EACH ROW
WHEN (NEW.b IS NULL AND NEW.a IS NOT NULL)
EXECUTE PROCEDURE trg_foo_b_default();

为了使此更有效,我使用WHEN子句(可从Postgres 9.0开始使用)与触发器定义.这样触发功能只能在实际使用时执行.我假设在这里,如果一个IS NULL,我们可以让b IS NULL幻灯片.

以与DEFAULT值相似但略有不同的方式工作.使用认值,您可以显式地插入NULL以覆盖认值.这是不可能的,NULL被替换为来自b的值.

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...