完整问题重写
我正在寻找 First() 聚合函数。
在这里,我发现了一些几乎有效的东西:
CREATE OR REPLACE FUNCTION public.first_agg ( anyelement, anyelement )
RETURNS anyelement LANGUAGE sql IMMUTABLE STRICT AS $$
SELECT $1;
$$;
-- And then wrap an aggregate around it
CREATE AGGREGATE public.first (
sfunc = public.first_agg,
basetype = anyelement,
stype = anyelement
);
Run Code Online (Sandbox Code Playgroud)
问题是当 varchar(n) 列通过 first() 函数时,它会被转换为简单的 varchar(没有大小)。尝试在函数中将查询返回为 RETURNS SETOF anyelement,我收到以下错误:
错误:查询的结构与函数结果类型 Estado de SQL:42804 不匹配:返回的类型字符变化与第 2 列中的预期类型字符变化(40) 不匹配。上下文:PL/pgSQL 函数 vsr_table_at_time(anyelement,timestamp without time zone ) 第 31 行在 RETURN QUERY
在同一个 wiki 页面中,有一个指向该函数 …
我正在尝试使用一些动态 SQL 在函数内重新创建表的结构。
EXECUTE 'CREATE TABLE ' || my_table_name || '_bk' ||
' (like ' || _my_table_name || ')';
Run Code Online (Sandbox Code Playgroud)
这将类似于:
CREATE TABLE my_table_bk
(like my_table);
Run Code Online (Sandbox Code Playgroud)
但我需要放弃所有约束。使用EXCLUDING CONSTRAINTS在类似的选项,它仍然复制NOT NULL约束(文档证实了这一行为):
CREATE TABLE my_table_bk
(like my_table EXCLUDING CONSTRAINTS);
Run Code Online (Sandbox Code Playgroud)
问题是,如何在没有 NOT NULL 约束的情况下重新创建表结构,或者删除表中的所有 NOT NULL 约束?