老师,Hologres中ON CONFLICT部分列场景下,未插入的列如何可以配置默认值? 我测试下[阿里云实时数仓]

问题1:老师,Hologres中ON CONFLICT部分列场景下,未插入的列如何可以配置默认值? 我测试下default已经不起作用了? 问题2:比如原表3列 ,我使用on conflict (key) do update的方式更新两列,第三列是col3 bigint default 0配置方式,但是插入后第三列是null而不是0,这个是这样吗?还是使用方式不对?

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
=====这是一个广告位,招租中,联系qq 78315851====
1 条回复 A 作者 M 管理员
  1. 问题 1: 在 Hologres 中,在使用 ON CONFLICT 子句时,您想知道如何为未插入的列配置默认值,因为测试中发现默认值似乎不起作用了。

    对于 ON CONFLICT 子句中未被更新的列,默认值是不会生效的。这是因为在 ON CONFLICT UPDATE 方式中,未被更新的列不会重新计算默认值。只有指定的更新列才会触发更新操作,其他列将保持原有的值或者按照约束的要求进行处理。

    如果您希望为未插入的列配置默认值,可以在插入数据时使用 INSERT INTO … DEFAULT VALUES 语句,并且确保在插入时提供默认值。这样可以确保所有列都会使用正确的默认值。

    问题 2: 在使用 ON CONFLICT (key) DO UPDATE 的方式更新两列时,第三列 col3 是一个 bigint 类型并配置了默认值为 0。但是在插入后,第三列却是 null 而不是 0。您想知道是否这样设计,还是可能存在使用方式上的错误?

    根据您的描述,使用 ON CONFLICT (key) DO UPDATE 时,未更新的列将保留原有的值或按照约束的要求进行处理。对于 bigint 类型的列 col3,默认值为 0,但是在插入时未指定该列的新值,所以它会保持为 null。这是符合预期行为的。

    如果您希望在使用 ON CONFLICT DO UPDATE 时设置 col3 的默认值,可以在更新部分的 SET 子句中指定默认值。例如:

    INSERT INTO your_table (key, col1, col2, col3)VALUES (...), (...)ON CONFLICT (key) DO UPDATESET col1 = EXCLUDED.col1, col2 = EXCLUDED.col2, col3 = COALESCE(EXCLUDED.col3, 0)

    上述示例中的 COALESCE 函数会将新插入的值 EXCLUDED.col3 转换为非空,如果该值为 null,则使用默认值 0。

  2. 回答1:什么场景default不起作用? insert on conflict,不冲突就是写入新数据,默认值会生效;冲突就是更新,只改你插入的列 回答2:是用什么做的insert on conflict?看下query记录,怀疑是insert时候定义了第三列的值,所以默认值不生效,此回答整理自钉群“实时数仓Hologres交流群”