【问题标题】:Upon insert, how can I programmatically convert a null value to the column's default value?插入时,如何以编程方式将空值转换为列的默认值?
【发布时间】:2013-01-08 10:48:05
【问题描述】:

我有一个表,我为其中的一些列提供了默认值。我想创建一个函数,其参数对应于将在将任何空值修改为列的默认值后在表中插入记录的列。我不想根据哪些参数为空来以编程方式构造查询。基本上我想要像

INSERT into Table (c1, c2, c3, c4)
Values (coalesce(somevar, DEFAULT(c1)), ...)

这可能吗?我见过mysql can do this。 postgres 是否提供类似的功能? 我使用的是 9.1 版

更新:question 提供了一些有趣的解决方案,但不幸的是,结果始终是文本。我想将默认值作为其真正的数据类型,以便我可以使用它来插入它。我试图找到一种解决方案,将默认值从文本转换为其数据类型(以文本形式提供),但我找不到方法:

SELECT column_name, column_default, data_type
FROM information_schema.columns
WHERE (table_schema, table_name) = ('public', 'mytable')
AND column_name = 'mycolumn'
ORDER BY ordinal_position;

以上内容将 column_default 和 data_type 作为文本返回,那么如何将 column_default 转换为 data_type 的 value?如果我能做到这一点,那么我的问题就迎刃而解了。

【问题讨论】:

  • 你能解释一下吗?我的列被声明为 NOT NULL DEFAULT xxx
  • 此外,关键字 DEFAULT 不能在 CASE 或合并中使用。它抛出一个错误:insert into table (c1, c2) values (some_var, coalesce(some_other_var, DEFAULT)) --> 抛出一个语法错误
  • 抱歉打扰了,我的错误

标签: postgresql


【解决方案1】:

如果表定义接受所有列的默认值的 INSERT,则以下两步方法可能有效:

CREATE FUNCTION insert_func(c1 typename, c2 typename, ...)
RETURNS VOID AS $$
DECLARE
 r record;
BEGIN
 INSERT into the_table default values  returning *,ctid INTO r;
 UPDATE the_table set
  col1=coalesce(c1,r.col1),
  col2=coalesce(c2,r.col2),
  ...
 WHERE the_table.ctid=r.ctid;
END;
$$ language plpgsql;

诀窍是在插入时将所有默认值放入 r 记录变量中,并随后在 UPDATE 中使用它们来替换任何非默认值。 ctid 是一个伪列,指定刚刚插入的行的内部唯一 ID。

警告:如果某些列具有默认空值和非空检查(或任何暗示不接受默认值的检查),此方法将不起作用,因为第一个INSERT 会失败。

【讨论】:

    【解决方案2】:

    我通过创建一个带有LIKEINCLUDING DEFAULTS 子句的临时表以匹配我的行类型,使用类似于丹尼尔的解决方案解决了我的问题,然后我使用

    INSERT INTO temp_table (c1, c2, ...) VALUES(x1, DEFAULT, ..)

    对我感兴趣的任何列使用默认关键字。然后我通过从临时表中选择并使用插入到真实表中

    VALUES( x1, coalesce(x2, temp_table.c2), ...)

    我不喜欢它,但它工作正常:我可以选择我想在哪些列上执行“null-replace-with-default”检查,如果我超载我的函数接受一个记录数组。

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 2018-10-04
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 2011-12-23
      • 1970-01-01
      • 2013-01-02
      相关资源
      最近更新 更多