不能创建存储过程来插入数据:串行列的类型不匹配


CREATE TABLE test ( id serial primary key, name text );
CREATE OR REPLACE PROCEDURE test_insert_data( "name" text)
LANGUAGE SQL
AS $$
INSERT INTO public.test values("name")
$$;

错误,提示:

column "id" is of type integer but expression is of type character varying
LINE 4: INSERT INTO public.test values("name")
^
HINT:  You will need to rewrite or cast the expression.

我遵循这个教程:https://www.enterprisedb.com/postgres-tutorials/10-examples-postgresql-stored-procedures.
显然,我不需要附加id列来插入。

没有引号问题,就像注释所建议的那样。
链接的教程是不正确的。(但还是个坏建议。)

缺失的目标列列表是问题所在。

CREATE OR REPLACE PROCEDURE test_insert_data("name" text)
LANGUAGE sql AS
$proc$
INSERT INTO public.test(name)  -- !! target column list !!
VALUES ("name");
$proc$;

(为了记录,由于"name"是一个有效的标识符,所有双引号只是噪声,可以(应该)省略。

如果你没有指定目标列,Postgres开始从左到右填充列,在你的例子中从id开始-这会触发报告的错误消息。

(链接的教程还提供了一个ID值,因此它不会引发相同的异常。)

即使没有显式的目标列列表也可以工作,通常仍然建议为持久化的INSERT命令添加一个。否则,以后对表结构的修改可能会无声地破坏代码。如果运气不好,你只会在以后才会注意到——比如填错了列而没有引发错误。

:

  • 不指定列的SQL INSERT。会发生什么呢?
  • 在触发器函数中插入Postgres

旁白:I wouldnever使用"name"作为列名。即使在通用教程中也没有。这没有帮助。任何列名都是一个"名称"。请使用有意义的标识符。

最新更新