无法创建用于插入数据的存储过程:序列列的类型不匹配 [英] Cannot create stored procedure to insert data: type mismatch for serial column

查看:0
本文介绍了无法创建用于插入数据的存储过程:序列列的类型不匹配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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命令添加一个。否则,以后对表结构的修改可能会以静默方式中断您的代码。在某种程度上,如果运气不好,您只会在很久以后才会注意到-比如填写了错误的列而不会引发错误。

请参阅:

旁白:我将从不使用";name";作为列名。即使是在一般教程中也不是。这没什么用。任何列名都是&Quot;名称。请改用有意义的标识符。

这篇关于无法创建用于插入数据的存储过程:序列列的类型不匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆