当前位置: 首页 > 知识库问答 >
问题:

Postgres-关于冲突-如何知道是否发生了更新而不是插入[重复]

幸鸿轩
2023-03-14
CREATE TABLE foo
(
    f0 int,
    time_stamp timestamp,
    CONSTRAINT foo_pk PRIMARY KEY (f0)
)
`ON CONFLICT .. DO UPDATE set is_update=true`

然后使用returning is_update来获得我想要的内容。这样做的问题是引入了一个与数据本身无关的附加列。

共有1个答案

终翔
2023-03-14

您可以在foo表上创建触发器函数。然后用TG_OP保留字捕获insert操作,如果key存在,则执行update,否则插入新行。尚未用大行测试:)

1.创建过程:

CREATE OR REPLACE FUNCTION public.f0_update_on_duplicate()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
declare _exists boolean;
begin
  if TG_OP = 'INSERT' then
    select exists(select true from foo where f0 = NEW.f0) into _exists;
    raise notice '%', _exists;
    if _exists = TRUE then
      update foo set time_stamp = NEW.time_stamp where f0 = NEW.f0;
      return NULL;
    else
      return NEW;
    end if;
  end if;
end
$function$;

2.将过程附加到foo表:

CREATE TRIGGER update_on_duplicate 
BEFORE INSERT ON foo FOR EACH ROW EXECUTE PROCEDURE
f0_update_on_duplicate();
 类似资料:
  • 问题内容: 我们有一个数据库,每天cronjob在午夜更新,我们从外部XML获取新数据。 我们要做的是插入所有新内容,并在键重复的情况下更新该字段。 我们想知道的是实际插入了哪些行,这意味着我们想要一个新项目的列表。是否有可能返回新插入的查询?基本上,我们将需要获取所有新的ID,而不是新插入的数量。 谢谢 问题答案: 添加一列并更改您的查询: 您也可以在触发器中增加它,使您可以保持查询不变。

  • 我有一张像下面这样的桌子。我试图根据CTE中的值合并到此表中。但当我试图在出现冲突时更新表时,它无法获得CTE中的值 现在使用cte,我想在这个表中插入/更新记录。下面是我用来做同样的事情的代码。当记录已经存在于表中时,我想根据cte(cte_input_data.data_type_id)中的data_type_id值更新表,但它失败并出错。 它应该实现的是 > 如果cte_输入_数据。数据类型

  • 我有一个表,它有,,和 在常规插入时自动递增。 的值介于1到10之间,因为有10个问题,但对表来说不是唯一的,并且依赖于列。 用于引用单独表中的报表。 我要实现的是,如果对于特定的没有冲突的,则插入新的记录。如果有冲突,则用新的

  • 问题内容: 我正在使用PDO插入记录(mysql和php) 有没有办法知道它是否成功插入,例如,是否由于重复而没有插入记录? 编辑:当然,我可以查看数据库,但是我的意思是程序反馈。 问题答案: 成功返回true。还有,你可以检查错误。

  • 问题内容: 我试着用两个类来做图像分类。我有1000张照片 均衡的班级。当我训练模型时,我得到一个低常数的验证 准确性,但验证损失减少。这是一个过度装修的迹象还是 不合身?我还应该注意到,我正在尝试重新训练《盗梦空间》 具有新类和不同数据集的V3模型。 问题答案: 什么是过度装配 过度拟合(或欠拟合)发生在模型过于特定(或不特定)时 足够具体)的训练数据,并不能很好地推断出 真域。从现在起,我只想

  • 我试图将Postgres用作文档存储,但在Postgres解析器似乎不喜欢JSONB操作符的情况下,当我试图有效地向上插入文档时,遇到了一个问题。 我有一张桌子: 我尝试用以下方式插入数据: 我收到这条错误消息: 我试过数据- 我想将标识符列(示例中的a)留在JSON中,而不是使其成为表上的列。 我正在尝试做的事情目前是否得到支持?