如何在一个查询中插入和更新

Posted

技术标签:

【中文标题】如何在一个查询中插入和更新【英文标题】:How can I Insert and update in one query 【发布时间】:2020-07-14 06:17:34 【问题描述】:

尝试在查询中写入插入和更新。所以我的情况是 - 如果存在一行,则执行 upsert 并插入一个新行。但是行不存在只做插入。

所以这就是我正在尝试的 -

Select exist(Select 1 from table where condition)

if(exists)

Update table set column =value where condition.
Insert into table (column) values (" ").

else

Insert into table (column) values (" ")


由于我在这里写了这么多查询,有没有可能我可以在一个查询中涵盖所有这些。

提前致谢

【问题讨论】:

"然后做 upsert 并插入一个新行" 对我来说毫无意义。如果该行存在,为什么要再次插入?您的意思是写“然后进行更新并且插入新行”吗? @a_horse_with_no_name 不是那个意思。我的要求只有这样。我需要更新上一行(如 planEnd 列)并插入新行(planStart 列) edit你的问题(通过点击下面的edit链接)并添加表格的定义(如create table声明),一些示例数据和基于该数据的预期输出为formatted text。请参阅here,了解有关如何创建漂亮的文本表格的一些提示。 (edit 您的问题 - 在 cmets 中邮政编码或其他信息) @jarvis569 。 . .样本数据和期望的结果真的很有帮助。听起来您正在尝试维护一个类型 2 表(具有有效和结束日期的表)。 【参考方案1】:

您可以只编写插入查询并检查CONFLICT CLAUSE。

Postgresql 支持冲突子句,当与特定CONSTRAINT 发生冲突时触发该子句。

假设您有表 t 主键列 idname 字段:

CREATE TABLE t ( id integer primary key, name varchar(255));

您可以在插入时检查主键约束:

INSERT INTO t (id, name) VALUES (1, 'Name1')
ON CONFLICT ON t_id_constraint
DO UPDATE SET name='Name1';

t_id_constraint 是 id 列唯一性的约束名称。 此查询将在没有冲突时向表中插入新值,并在表中找到新 id 时更新。

Original answer

【讨论】:

以上是关于如何在一个查询中插入和更新的主要内容,如果未能解决你的问题,请参考以下文章

如果 COUNT = 0 [重复],如何在 mySQL 中插入或更新查询

如何在mysql 5中记录特定表的插入/更新查询

如何修改 Symfony ORM 插入\更新查询

如何使用 Laravel 4.2 在单个查询(不是 for 查询循环)中批量插入或更新

如何在 SQL Server 2005 中进行更新插入(更新或插入)

Google Datastore 插入/更新查询中如何使用长 ID?