在插入table / PostgreSQL之前更改值

时间:2013-06-10 22:13:46

标签: sql postgresql default-value sql-insert postgresql-8.4

我遇到了以下问题。我想更改一些INSERT语句的值,例如有一个问题:

INSERT INTO table(a,b) values(x,y);

但是表格还有另一栏 c 。我想从上面的查询中检查(在INSERT之前) b 的值,并根据一个值,然后设置 c = z ,但仅针对我刚刚插入的特定行

我认为某些触发器可以帮助解决我的问题,但我不知道该怎么做。任何伪代码都会受到赞赏。

2 个答案:

答案 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条款仅用于测试方便。
重要的部分是SELECTCASE声明。

此测试适用于第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 *