Postgresql 如何通过查看多个表隐式插入序列ID
我有两个表,通过is关系在E/R中连接。一个代表“母表” 另一个表示“子表” 现在,这两个表在一个视图中合并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
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:是的,这是可以保证的。这就是序列的作用。好吧,为了保证,规则必须是原子执行的(因此不可能交错),我不太明白序列的实现如何会有任何影响?为什么触发器是首选方式,规则似乎是用来做这些事情的?是否有任何非主观原因认为触发器优于规则?@Simcurrval
返回的值是会话的本地值。它不会以任何方式受到其他用户会话的影响。可能听起来有点偏执,但由于交错以及不同用户访问这些表的可能性。是否可以保证currval(‘person_id_seq’)是正确的值,而不是更高的值?@Sim:是的,这是可以保证的。这就是序列的作用。好吧,为了保证,规则必须是原子执行的(因此不可能交错),我不太明白序列的实现如何会有任何影响?为什么触发器是首选方式,规则似乎是用来做这些事情的?是否有任何非主观原因认为触发器优于规则?@Simcurrval
返回的值是会话的本地值。它不会受到其他用户会话的任何影响。