【问题标题】:how to insert DEFAULT into a prepared statement in PostgreSQL如何在 PostgreSQL 中将 DEFAULT 插入到准备好的语句中
【发布时间】:2020-02-29 20:20:07
【问题描述】:

我正在尝试使用准备好的语句将值插入数据库,但有时我需要为某个值插入文字“DEFAULT”,我该怎么做?

CREATE TABLE test (id int, firstname text default 'john', lastname text default 'doe');

这就是我想要做的,但是使用准备好的语句:

insert into test (id, firstname, lastname) VALUES ('1', DEFAULT, DEFAULT);

但这会导致错误(原因很明显):

PREPARE testprep (integer, text, text) AS INSERT INTO test (id, firstname, lastname) VALUES ($1, $2, $3);
EXECUTE testprep('1',DEFAULT,DEFAULT);

错误:

ERROR: syntax error at or near "DEFAULT"

我使用 SQL-Fiddle 创建的两个示例:

http://sqlfiddle.com/#!15/243ae/1/0

http://sqlfiddle.com/#!15/243ae/3/0

【问题讨论】:

标签: postgresql prepared-statement


【解决方案1】:

使用准备好的语句无法做到这一点。

唯一的转义是表上的BEFORE INSERT 触发器,它将某些数据值(例如NULL)替换为默认值。但这不是一个好的解决方案,而且会降低性能。

另一种转义路线是使用多个准备好的语句,一个用于您想要设置为默认值的每种组合。

【讨论】:

    【解决方案2】:

    您可以尝试在插入语句中省略默认列:

    PREPARE testprep (integer) AS
    INSERT INTO test (id) VALUES ($1);
    EXECUTE testprep('1');
    

    Postgres 应该依赖firstnamelastname 列的表定义中的默认值。来自 Postgres documentation

    当创建新行并且没有为某些列指定值时,这些列将填充它们各自的默认值。

    【讨论】:

    • 在我的实际情况中,我的插入语句中有 21 个字段,并且我多次使用相同的准备好的语句,并且可能需要将不同的字段设置为“DEFAULT”,只需省略一两个...我无法想象 postgresql 会知道我遗漏了哪个。
    • 那么你要么需要一个灵活的准备好的语句,要么你更可能只需要一组单独的语句。
    • 假设我只有一个名字或一个姓氏,我留下一个或另一个,postgresql如何知道它是提供的名字还是姓氏?
    • Postgres 仅“知道”您在插入中定位的列,因为您在语句中指定了它们。
    • Postgres (SQL) 要求在执行语句之前定义所有列和类型,您显然知道。这是一个功能,而不是一个错误。一个超级烦人、令人反感的功能,它使 SQL 代码非常冗长,并且与您有可变输入或动态输出的情况不匹配。但以一种很好的方式 ;-) SQL 的声明性非常令人讨厌。
    猜你喜欢
    • 2017-04-13
    • 2011-07-05
    • 2013-09-18
    • 2015-03-02
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2012-11-28
    相关资源
    最近更新 更多