Error from trigger function: ERROR: column does not exist
Error from trigger function: ERROR: column does not exist
我创建了一个触发器:
CREATE OR REPLACE FUNCTION public.delete_user()
RETURNS TRIGGER AS $func$
BEGIN
EXECUTE format('UPDATE public.user SET %I = %L WHERE state = %L',
"state", "active", "deleted");
END;
$func$ LANGUAGE plpgsql;
CREATE TRIGGER deleted_user
AFTER UPDATE ON public.user
FOR EACH ROW
WHEN (OLD.state IS DISTINCT FROM NEW.state)
EXECUTE PROCEDURE delete_user();
比运行之后:
update public.user set state = 'active' where fullname = '1234'
我收到错误:
> ERROR: column "state" does not exist
> LINE 1: ...UPDATE public.user SET %I = %L WHERE state = %L', "state", "...
> ^
> QUERY: SELECT format('UPDATE public.user SET %I = %L WHERE state = %L', "state", "active", "deleted")
> CONTEXT: PL/pgSQL function delete_user() line 3 at EXECUTE SQL state: 42703
这是在用户 table 中定义的状态:
state text COLLATE pg_catalog."default" NOT NULL DEFAULT 'active'::text,
我是 Postgres 的新手所以我猜这是一个语法错误?
这会 有效:
CREATE OR REPLACE FUNCTION public.delete_user()
RETURNS TRIGGER AS
$func$
BEGIN
EXECUTE format('UPDATE public.user SET %I = %L WHERE state = %L',
'state', 'active', 'deleted');
RETURN NULL; -- or OLD (for AFTER trigger)
END
$func$ LANGUAGE plpgsql;
字符串文字的单引号而不是双引号(用于标识符)。您不需要为此动态 SQL 并且可以简化:
CREATE OR REPLACE FUNCTION public.delete_user()
RETURNS TRIGGER AS
$func$
BEGIN
UPDATE public.user SET state = 'active' WHERE state = 'deleted';
RETURN NULL;
END
$func$ LANGUAGE plpgsql;
虽然语法现在有效,但它会导致无限循环并且没有任何意义。我不确定你打算用这个做什么。
相关:
- Are PostgreSQL column names case-sensitive?
旁白:public.user
有效,因为 schema-qualification 消除了歧义,但裸 table 名称 user
总是需要 double-quoting:"user"
. 从不使用像user
这样的保留字作为标识符。
我创建了一个触发器:
CREATE OR REPLACE FUNCTION public.delete_user()
RETURNS TRIGGER AS $func$
BEGIN
EXECUTE format('UPDATE public.user SET %I = %L WHERE state = %L',
"state", "active", "deleted");
END;
$func$ LANGUAGE plpgsql;
CREATE TRIGGER deleted_user
AFTER UPDATE ON public.user
FOR EACH ROW
WHEN (OLD.state IS DISTINCT FROM NEW.state)
EXECUTE PROCEDURE delete_user();
比运行之后:
update public.user set state = 'active' where fullname = '1234'
我收到错误:
> ERROR: column "state" does not exist
> LINE 1: ...UPDATE public.user SET %I = %L WHERE state = %L', "state", "...
> ^
> QUERY: SELECT format('UPDATE public.user SET %I = %L WHERE state = %L', "state", "active", "deleted")
> CONTEXT: PL/pgSQL function delete_user() line 3 at EXECUTE SQL state: 42703
这是在用户 table 中定义的状态:
state text COLLATE pg_catalog."default" NOT NULL DEFAULT 'active'::text,
我是 Postgres 的新手所以我猜这是一个语法错误?
这会 有效:
CREATE OR REPLACE FUNCTION public.delete_user()
RETURNS TRIGGER AS
$func$
BEGIN
EXECUTE format('UPDATE public.user SET %I = %L WHERE state = %L',
'state', 'active', 'deleted');
RETURN NULL; -- or OLD (for AFTER trigger)
END
$func$ LANGUAGE plpgsql;
字符串文字的单引号而不是双引号(用于标识符)。您不需要为此动态 SQL 并且可以简化:
CREATE OR REPLACE FUNCTION public.delete_user()
RETURNS TRIGGER AS
$func$
BEGIN
UPDATE public.user SET state = 'active' WHERE state = 'deleted';
RETURN NULL;
END
$func$ LANGUAGE plpgsql;
虽然语法现在有效,但它会导致无限循环并且没有任何意义。我不确定你打算用这个做什么。
相关:
- Are PostgreSQL column names case-sensitive?
旁白:public.user
有效,因为 schema-qualification 消除了歧义,但裸 table 名称 user
总是需要 double-quoting:"user"
. 从不使用像user
这样的保留字作为标识符。