mos*_*sid 27 postgresql triggers database-design default-value postgresql-9.2
如果我有一个列说column a任何给定的值,并且我希望另一列column b 具有default value根据值的值column a
换句话说:
如果column a = 'peter'那么column b default value = 'doctor'.
Erw*_*ter 45
这是不可能的简单DEFAULT值,因为手册明确指出:
该值是任何无变量表达式(不允许子查询和对当前表中其他列的交叉引用).
您可以使用触发器:
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();
Run Code Online (Sandbox Code Playgroud)
为了使这更有效,我使用了一个WHEN带有触发器定义的子句(自Postgres 9.0起可用).这样,触发器功能仅在实际有用时执行.我假设在这里,我们可以让b IS NULL幻灯片a IS NULL.
以与价值相似但略有不同的方式工作DEFAULT.
使用默认值,您可以显式插入NULL以取代默认值.这是不可能在这里,NULL在b被替换为得到的值a.
jia*_*ian 22
在 PostgreSQL 12 或更高版本中,我们可以使用生成的列。
https://www.postgresql.org/docs/12/ddl-
generated-columns.html 示例:
create temp table foo (
a text,
b text GENERATED ALWAYS AS (
case WHEN a = 'telegram' THEN 'im'
WHEN a = 'proton' THEN 'email'
WHEN a = 'infinity' THEN 'idea'
ELSE 'bad idea'
end) stored
);
Run Code Online (Sandbox Code Playgroud)
——测试时间。
insert into foo(a) values ('infinity');
insert into foo(a) values ('infinity1');
Run Code Online (Sandbox Code Playgroud)
返回;
a | b
-----------+----------
infinity1 | bad idea
infinity | idea
Run Code Online (Sandbox Code Playgroud)
当你尝试insert into foo(b) values ('infinity1')产生错误时。
--ERROR: cannot insert into column "b" DETAIL: Column "b" is a generated column.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11433 次 |
| 最近记录: |