Postgresql INSERT ON DUPLICATE语句返回什么?

Postgresql INSERT ON DUPLICATE语句返回什么?,postgresql,insert-update,Postgresql,Insert Update,在Postgresql中,插入带有on冲突和returning子句的行时,返回什么?插入的行?插入前的行?如果没有插入行怎么办 考虑以下语句使用。。。在冲突中,什么也不做……返回: 插入测试 值:id,:name 在冲突上无所作为 返回id; 下面的声明。。。关于冲突。。。做更新。。。返回…: 插入测试 值:id,:name 关于冲突名称,请执行更新 设置id=已排除。id+10 返回id; 并假定id和name列都是唯一的。上述声明将返回什么 与此密切相关的是,如何找到导致冲突的现有行的ID

在Postgresql中,插入带有on冲突和returning子句的行时,返回什么?插入的行?插入前的行?如果没有插入行怎么办

考虑以下语句使用。。。在冲突中,什么也不做……返回:

插入测试 值:id,:name 在冲突上无所作为 返回id; 下面的声明。。。关于冲突。。。做更新。。。返回…:

插入测试 值:id,:name 关于冲突名称,请执行更新 设置id=已排除。id+10 返回id; 并假定id和name列都是唯一的。上述声明将返回什么

与此密切相关的是,如何找到导致冲突的现有行的ID

是的,我可以很容易地试一下。事实上,我确实看到了答案。很容易做出错误的猜测,很难记住答案,复制实验也很昂贵,所以我认为这个问题对其他人很有用。

returning子句总是返回写入表中的信息,即插入或更新的信息。如果未发生写入,则不会返回任何行

因此,如果要获取导致冲突的现有行的id,则不能使用on conflict do nothing。相反,你可以在冲突中使用。。。do update with a dummy update(使用虚拟更新进行更新),以引发实际上不会修改现有行内容的写入,如下所示:

插入测试 价值观4,‘单身’ 关于冲突名称,请执行更新 set id=test.id-强制写入,但不更改任何内容 返回id; 但是请注意,这种人为写入可能仍然有不希望的副作用,特别是在触发器就位的情况下。即使数据不变,也会生成新的元组

实验证明:

如果存在测试,则丢弃表格; 创建表测试 id int主键, 名称文本唯一 ; 插入测试 值1,‘单态’; 从测试中选择*; - +-+-----+ -| id |名称| - +-+-----+ -| 1 |单身| - +-+-----+ 插入测试 值2,“单例” 在冲突上无所作为 返回id; -结果:空 插入测试 价值观2,“其他东西” 关于冲突名称,请执行更新 设置id=已排除。id+10 返回id; -结果: - +-+ -| id| - +-+ - |2 | - +-+ 插入测试 价值观3,“单身” 关于冲突名称,请执行更新 设置id=已排除。id+10 返回id; -结果: - +-+ -| id| - +-+ - |13| - +-+ 插入测试 价值观4,‘单身’ 关于冲突名称,请执行更新 set id=test.id 返回id; -结果: - +-+ -| id| - +-+ - |13| - +-+ 从测试中选择*; -结果: - +-+-------+ -| id |名称| - +-+-------+ -| 2 |还有别的吗| -| 13 |单身| - +-+-------+ returning子句始终返回写入表的信息,即插入或更新的信息。如果未发生写入,则不会返回任何行

因此,如果要获取导致冲突的现有行的id,则不能使用on conflict do nothing。相反,你可以在冲突中使用。。。do update with a dummy update(使用虚拟更新进行更新),以引发实际上不会修改现有行内容的写入,如下所示:

插入测试 价值观4,‘单身’ 关于冲突名称,请执行更新 set id=test.id-强制写入,但不更改任何内容 返回id; 但是请注意,这种人为写入可能仍然有不希望的副作用,特别是在触发器就位的情况下。即使数据不变,也会生成新的元组

实验证明:

如果存在测试,则丢弃表格; 创建表测试 id int主键, 名称文本唯一 ; 插入测试 值1,‘单态’; 从测试中选择*; - +-+-----+ -| id |名称| - +-+-----+ -| 1 |单身| - +-+-----+ 插入测试 值2,“单例” 在冲突上无所作为 返回id; -结果:空 插入测试 价值观2,“其他东西” 关于冲突名称,请执行更新 设置id=已排除。id+10 返回id; -结果: - +-+ -| id| - +-+ - |2 | - +-+ 插入测试 价值观3,“单身” 关于冲突名称,请执行更新 设置id=已排除。id+10 返回id; -结果: - +-+ -| id| - +-+ - |13| - +-+ 插入测试 价值观4,‘单身’ 关于冲突名称,请执行更新 set id=test.id 返回id; -结果: - +-+ -| id| - +-+ - |13| - +-+ 从测试中选择*; -结果: - +-+-------+ -| id |名称| - +-+-------+ -| 2 |还有别的吗| -| 13 |单身| - +-+-------+