我想通过一个查询将数据添加到至少三个表中。我想到了这样的事情:
WITH ins AS (
INSERT INTO core.adr
(street, "number", postal_code, city)
VALUES
('test 1', '25a', '00912', 'villageman')
RETURNING id)
INSERT INTO core.adr_information
(idref, info)
SELECT id, 'test data'
FROM ins;
Run Code Online (Sandbox Code Playgroud)
这完全适用于两个表。
这里的主要问题是,所有其他查询都需要id
第一个INSERT
查询的值,这似乎无法通过这种方式进行管理。我认为它可以通过存储过程或事务轻松完成,但我希望解决方案是一个简单而可靠的查询。
我是否忽略了什么?是否有可能以这种方式或另一种方式(没有存储过程*或事务)?
笔记
* Altough,严格来说,Postgres没有已存储过程,只有功能,@Erwin Brandstetter修改正确地通过评论中指出。有关相关信息,请参阅本系列帖子。
我理解以下之间的区别:
在 SQL Server 中,“存储过程”允许通过EXEC
. 与使用SELECT
该返回执行的任何其他函数相比,它提供了什么NULL
?
当 PostgreSQL 获得存储过程时,它们会给我带来什么,规范中函数和存储过程之间的正式区别是什么?
postgresql stored-procedures terminology functions sql-standard
我有一个相当复杂的 UDF(在一堆表中移动并创建一堆新表),其中可能会发生多次中止。在每次操作之前,我想记录操作发生的时间和查询本身。UDF 如下所示:
log function_start
log sql1
execute sql1
log sql2
execute sql2
...
log sqlN
execute sqlN
log function_end
Run Code Online (Sandbox Code Playgroud)
每条日志语句都意味着向下表中插入一条新记录:
CREATE TABLE backup_logs
(
id serial NOT NULL,
t timestamp with time zone default now(),
sql text,
CONSTRAINT backup_logs_pkey PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)
如果发生中止,我希望sql1, sql2, ... sqlN
回滚,但inserto into backup_logs
会继续存在。问题:我怎样才能实现这一目标?
我对如何做某事没有疑问,但我是否应该这样做。抱歉,如果有更合适的论坛。
我有一个功能:
CREATE OR REPLACE FUNCTION get_name(user_id UUID) RETURNS TEXT AS $$
SELECT username
FROM users
WHERE users.id=user_id
$$ LANGUAGE 'sql';
Run Code Online (Sandbox Code Playgroud)
我喜欢使用这个函数在其他查询中从 user_id 转换为用户名。这是一个常见的操作,我认为一个函数会加快开发时间,以查找一次性统计数据以进行数据分析。我不关心查询速度。这是使用函数来执行此操作的好习惯还是我应该只执行连接?
我对此很陌生,我的同事说将函数用于常规选择/连接可以执行的操作是不好的做法。他还提到,函数最好用于常规选择无法完成的事情。所以我想问其他人什么是好的做法?
编辑:如果这是一种不好的做法,那么对于函数执行稍微复杂一些的常见操作的情况是否更合理?
据我了解,在 Postgres 中,过程用于操作数据,函数用于读取数据。我想要:
CREATE PROCEDURE test_variable()
LANGUAGE SQL
AS $$
BEGIN;
DECLARE some_id INTEGER;
SELECT nextval('some_sequence') INTO some_id;
INSERT INTO some_table (some_column) VALUES (some_id);
END;
$$;
Run Code Online (Sandbox Code Playgroud)
以上对我不起作用。当我寻找解决方案时,有很多不同的变量涉及函数$$
、声明、事物不返回任何内容;似乎找不到一个简单的例子;我只需要一个清晰的语法示例。
postgresql ×6
functions ×3
plpgsql ×3
transaction ×2
cte ×1
insert ×1
sql-standard ×1
terminology ×1