如何在一个查询中插入和更新
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
主键列 id
和 name
字段:
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 中插入或更新查询
如何使用 Laravel 4.2 在单个查询(不是 for 查询循环)中批量插入或更新