对于测试数据库,我想创建一堆测试用户(都具有“默认”值)。有一张桌子叫users
,还有一张桌子叫user_properties
。对于每个测试用户,我需要在这两个表中创建相应的条目。我已经有一个运行良好的 CTE 来执行此操作,但我无法将此 CTE 包装在一个循环中。
CREATE OR REPLACE FUNCTION ins()
returns void as
$BODY$
BEGIN
--RETURN record;
FOR Loopid IN 0..10 LOOP
with
user as (
insert into user
values(default)
returning id
)
,user_property as (
insert into user_property (property_of)
select id from user
returning id
)
select id from user_property;
END LOOP;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
它创建了函数,但在运行时它会抱怨
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
但是似乎不可能select
用一个替代来替换 CTE的最后一个perform
——这是一个语法错误。那我该怎么做呢?
可以假定表结构非常简单,因为大多数列将采用默认值。表user
只有一列id
,并且user_properties
有两列id
和- 这是表中 col的property_of
外键。两列都是自动生成的序列。id
user
id
标题非常相似的几个问题(示例)的答案是循环/cte 并不是真正必要的,所以它们对我没有帮助。
first:
user
是保留关键字,如果要作为表名需要用双引号:"user"
但是我强烈建议你找一个不同的名字。要回答您的直接问题:只需从 CTE 中删除最终选择 - 这是导致错误的原因(因为您需要将该选择的结果存储在某处)。
请注意,语言名称是一个标识符,您不应将其放在单引号中。
但是,您实际上并不需要一个函数: