Postgresql 如何通过查看多个表隐式插入序列ID

Postgresql 如何通过查看多个表隐式插入序列ID,postgresql,Postgresql,我有两个表,通过is关系在E/R中连接。一个代表“母表” 另一个表示“子表” 现在,这两个表在一个视图中合并 CREATE VIEW EMPLOYEES_VIEW AS SELECT P.id,name,address,store,paychecksize,day_of_creation FROM PERSONS AS P JOIN EMPLOYEES AS E ON P.id = E.id 我想编写一个规则或触发器,使db

我有两个表,通过is关系在E/R中连接。一个代表“母表”

另一个表示“子表”

现在,这两个表在一个视图中合并

CREATE VIEW EMPLOYEES_VIEW AS
    SELECT 
       P.id,name,address,store,paychecksize,day_of_creation
    FROM 
       PERSONS AS P
    JOIN
       EMPLOYEES AS E ON P.id = E.id
我想编写一个规则或触发器,使db用户能够在该视图上进行插入,从而避免将拆分的列插入到不同的表中

但我也想让它更方便,因为id是一个序列号,并且创建的日期有一个默认值,用户不需要提供这些值,因此下面的语句

INSERT INTO EMPLOYEES_VIEW (name, address, store, paychecksize)
VALUES ("bob", "top secret", "drugstore", 42)
应该足以导致

id|name|address   |day_of_creation
-------------------------------
1 |bob |top secret| 2013-08-13 15:32:42
id|   store |paychecksize
---------------------
1 |drugstore|42
员工

id|name|address   |day_of_creation
-------------------------------
1 |bob |top secret| 2013-08-13 15:32:42
id|   store |paychecksize
---------------------
1 |drugstore|42
一个基本的规则很简单

CREATE RULE EMPLOYEE_VIEW_INSERT AS ON INSERT TO EMPLOYEE_VIEW
DO INSTED (
    INSERT INTO PERSONS
    VALUES (NEW.id,NEW.name,NEW.address,NEW.day_of_creation),
    INSERT INTO EMPLOYEES
    VALUES (NEW.id,NEW.store,NEW.paychecksize)
)
应该足够了。但这并不方便,因为用户必须提供id和时间戳,即使这实际上不是必需的

如何重写/扩展该代码库以符合我的便利标准?类似于:

CREATE RULE EMPLOYEE_VIEW_INSERT AS ON INSERT TO EMPLOYEES_VIEW
DO INSTEAD 
(
    INSERT INTO PERSONS (id, name, address, day_of_creation)
    VALUES (default,NEW.name,NEW.address,default);
    INSERT INTO EMPLOYEES (id, store, paychecksize)
    VALUES (currval('persons_id_seq'),NEW.store,NEW.paychecksize)
);
这样,
persons.id
persons.day\u of_creation
的默认值将成为默认值。另一种选择是简单地从插入中删除这些列:

INSERT INTO PERSONS (name, address)
VALUES (NEW.name,NEW.address);
定义规则后,以下插入操作应起作用:

insert into employees_view (name, address, store, paychecksize)
values ('Arthur Dent', 'Some Street', 'Some Store', 42);
顺便说一句:对于当前的Postgres版本,使用
而不是
触发器是使视图可更新的首选方法

类似于:

CREATE RULE EMPLOYEE_VIEW_INSERT AS ON INSERT TO EMPLOYEES_VIEW
DO INSTEAD 
(
    INSERT INTO PERSONS (id, name, address, day_of_creation)
    VALUES (default,NEW.name,NEW.address,default);
    INSERT INTO EMPLOYEES (id, store, paychecksize)
    VALUES (currval('persons_id_seq'),NEW.store,NEW.paychecksize)
);
这样,
persons.id
persons.day\u of_creation
的默认值将成为默认值。另一种选择是简单地从插入中删除这些列:

INSERT INTO PERSONS (name, address)
VALUES (NEW.name,NEW.address);
定义规则后,以下插入操作应起作用:

insert into employees_view (name, address, store, paychecksize)
values ('Arthur Dent', 'Some Street', 'Some Store', 42);

顺便说一句:对于当前的Postgres版本,使用
而不是
触发器是使视图可更新的首选方法

听起来可能有点偏执,但由于交错以及不同用户访问这些表的可能性。是否可以保证currval(‘person_id_seq’)是正确的值,而不是更高的值?@Sim:是的,这是可以保证的。这就是序列的作用。好吧,为了保证,规则必须是原子执行的(因此不可能交错),我不太明白序列的实现如何会有任何影响?为什么触发器是首选方式,规则似乎是用来做这些事情的?是否有任何非主观原因认为触发器优于规则?@Sim
currval
返回的值是会话的本地值。它不会以任何方式受到其他用户会话的影响。可能听起来有点偏执,但由于交错以及不同用户访问这些表的可能性。是否可以保证currval(‘person_id_seq’)是正确的值,而不是更高的值?@Sim:是的,这是可以保证的。这就是序列的作用。好吧,为了保证,规则必须是原子执行的(因此不可能交错),我不太明白序列的实现如何会有任何影响?为什么触发器是首选方式,规则似乎是用来做这些事情的?是否有任何非主观原因认为触发器优于规则?@Sim
currval
返回的值是会话的本地值。它不会受到其他用户会话的任何影响。