我遇到了以下问题。我想更改一些INSERT语句的值,例如有一个问题:
INSERT INTO table(a,b) values(x,y);
但是表格还有另一栏 c 。我想从上面的查询中检查(在INSERT之前) b 的值,并根据一个值,然后设置 c = z ,但仅针对我刚刚插入的特定行
我认为某些触发器可以帮助解决我的问题,但我不知道该怎么做。任何伪代码都会受到赞赏。
答案 0 :(得分:2)
限制直接访问常规用户的表格是一种goog做法。它可以通过使用存储过程来完成,并仅为它们提供访问权限。例如(抱歉长代码):
create table foo (
a integer,
b integer,
c integer);
--== Create table. Yes, it is no PK, but for example it is not necesarry
create or replace function p_foo_insert(in aa integer, in ab integer) returns integer as
$$
declare
result integer;
begin
insert into foo (a, b, c) values (aa, ab, aa + ab) returning c into result;
return result;
end; $$ language plpgsql;
--== It is function for row insertion. Inside this function you can do any data manipulation.
select p_foo_insert(1, 2);
--== Test statement. Result must be a + b = 1 + 2 = 3
所以,忘记insert into
,使用存储过程:o)
答案 1 :(得分:1)
您可以在INSERT
语句中执行此操作,无需触发器。
给出表t
:
CREATE TEMP TABLE t (a int, b int, c int)
c
的默认值为NULL
考虑一下这个演示:
WITH i(x,y,z) AS (
VALUES
(1, 2, 111)
,(1, 7, 666)
)
INSERT INTO t(a,b,c)
SELECT x, y, CASE WHEN y = 2 THEN z ELSE NULL END
FROM i
RETURNING *
WITH
(需要Postgres 9.1+)和RETURNING
条款仅用于测试方便。
重要的部分是SELECT
和CASE
声明。
此测试适用于第8.4页:
INSERT INTO t(a,b,c)
SELECT x, y, CASE WHEN y = 2 THEN z ELSE NULL END
FROM (
VALUES
(1, 2, 111)
,(1, 7, 666)
) i (x,y,z)
RETURNING *