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"作为列名。即使在通用教程中也没有。这没有帮助。任何列名都是一个"名称"。请使用有意义的标识符。