gpt4 book ai didi

postgresql - 如何通过多个表的 View 隐式插入 SERIAL ID

转载 作者:行者123 更新时间:2023-11-29 13:33:37 25 4
gpt4 key购买 nike

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

CREATE TABLE PERSONS(
id SERIAL NOT NULL,
name character varying NOT NULL,
address character varying NOT NULL,
day_of_creation timestamp NOT NULL DEFAULT current_timestamp,
PRIMARY KEY (id)
)

另一个代表“子表”

CREATE TABLE EMPLOYEES (
id integer NOT NULL,
store character varying NOT NULL,
paychecksize integer NOT NULL,
FOREIGN KEY (id)
REFERENCES PERSONS(id),
PRIMARY KEY (id)
)

现在这两个表连接在一个 View 中

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

我想编写一个规则或一个触发器,使数据库用户能够在该 View 上进行插入,从而避免将列拆分到不同表中的令人讨厌的细节。

但我也想让它更方便,因为 id 是一个 SERIAL 并且 day_of_creation 有一个默认值,没有实际需要用户必须提供这些,因此像这样的声明

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

基本规则很简单

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.idpersons.day_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 版本, 而不是 触发器是使 View 可更新的首选方法。

关于postgresql - 如何通过多个表的 View 隐式插入 SERIAL ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18210827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com