Questions tagged «upsert»

UPSERT:SQL-UPDATE一行,如果找不到,则插入新行。

3
在PostgreSQL中实现UPSERT的惯用方式
我已经阅读了UPSERTPostgreSQL中的不同实现,但是所有这些解决方案都相对较旧或相对陌生(例如,使用可写CTE)。 而且我根本不是psql专家,可以立即找出这些解决方案是否过时,因为它们是值得推荐的,还是(几乎所有它们都是)仅仅是玩具示例而不适合生产使用。 在PostgreSQL中实现UPSERT的最线程安全的方法是什么?

2
如何使用单个查询插入或更新?
我有一个表测试,该表具有列ID,主键和自动递增的名称。我只想在没有记录的情况下插入新记录。 输入的ID为30122,名称为john 如果有ID为30122的记录,那么我将name列更新为john,如果没有记录,则我插入了一条新记录。 我可以使用2个查询 select * from test where id=30122 如果它有一些记录,那么我可以使用 update test set name='john' where id=3012 或者如果它没有记录,那么我可以使用 insert into test(name) values('john') 但是我想使用单个查询? 有人可以告诉它是否可能吗?

2
如何在upsert中获取冲突行的ID?
我有一个tag包含2列的表格:id(uuid)和name(text)。现在,我想在表中插入一个新标签,但是如果该标签已经存在,我只想获取id现有记录的。 我以为我可以ON CONFLICT DO NOTHING结合使用RETURNING "id": INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT DO NOTHING RETURNING "id"; 但是,如果名称“ foo”的标记已存在,则返回空结果集。 然后,我将查询更改为使用noop DO UPDATE子句: INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT ("name") DO UPDATE SET "name" = 'foo' RETURNING "id"; 这可以按预期工作,但是有些混乱,因为我只是将名称设置为已经存在的值。 这是解决此问题的方法,还是我缺少一种更简单的方法?


1
将元素上载到表中时,“列引用不明确”
我正在使用PostgreSQL作为数据库。我需要在数据库中创建一个条目,如果该条目已经存在,则只需更新其字段即可,但是只有未设置该字段时,才应更新其中一个字段。 我已经从这个问题中使用过信息:https : //stackoverflow.com/questions/13305878/dont-update-column-if-update-value-is-null,它与我所拥有的很相关。 我尝试使用此查询,但是当我运行它时,它出现以下错误Column reference 'affiliate_code' is ambiguous: INSERT INTO accounts (id, token, affiliate_code) VALUES (value1, value2, value3) ON CONFLICT (id) DO UPDATE SET token = value2, affiliate_code = COALESCE(affiliate_code, value3); (当然,实际值将被替换)。 如果我替换affiliate_code = COALESCE(affiliate_code, value3)为affiliate_code = value3,则一切正常,但并非以我希望的方式运行。 我该如何工作? 这是我的表格的定义方式: CREATE TABLE accounts ( id VARCHAR NOT NULL UNIQUE, …

1
UPSERT-MERGE或@@ rowcount是否有更好的替代方法?[关闭]
很难说出这里的要求。这个问题是模棱两可,含糊,不完整,过于宽泛或夸张的,不能以目前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 7年前关闭。 我想知道您是否遇到过类似于UPSERT概念的T-SQL命令?使用选项(1)或(2)执行INSERT | UPDATE操作似乎过于复杂且容易出错。 目的 为了确保所需的记录(在本例中为employee_id 1)是最新的,而不必本质上两次写入相同的查询。 语境 表名:员工 员工编号:具有主键,并且身份属性设置为true 选项 执行SQL UPDATE ...检查@@ rowcount = 0和@@ error = 0 ...根据需要执行SQL INSERT 缺点:您实际上必须两次编写相同的查询,一次作为插入,一次作为更新 缺点:更多的代码=更多的输入时间 缺点:更多代码=更多错误空间 /programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure “使用@@ rowcount更新” 执行一个SQL MERGE 缺点:您实际上必须两次编写相同的查询,一次作为插入,一次作为更新 缺点:更多的代码=更多的输入时间 缺点:更多代码=更多错误空间 http://technet.microsoft.com/zh-cn/library/bb510625.aspx “ T-SQL合并” 执行SQL UPSERT(功能不存在) 专家:您一次定义了数据与表的关系(让SQL Server担心它是INSERT还是UPDATE) 优点:更少的代码=更快的实现 优点:更少的代码=更低的概率 UPSERT示例 UPSERT雇员(employee_id,employee_number,job_title,first_name,middle_name,sname,modified_at)VALUES(1,'00 -124AB37','Manager','John','T','Smith',GetDate()); 如果employee_id 1不存在:MS SQL执行INSERT语句 …

2
PostgreSQL UPSERT问题与NULL值
我在使用Postgres 9.5中的新UPSERT功能时遇到问题 我有一个表,用于汇总来自另一个表的数据。复合键由20列组成,其中10列可以为空。下面,我为我遇到的问题创建了一个较小的版本,尤其是NULL值。 CREATE TABLE public.test_upsert ( upsert_id serial, name character varying(32) NOT NULL, status integer NOT NULL, test_field text, identifier character varying(255), count integer, CONSTRAINT upsert_id_pkey PRIMARY KEY (upsert_id), CONSTRAINT test_upsert_name_status_test_field_key UNIQUE (name, status, test_field) ); 根据需要运行此查询(首先插入,然后随后的插入仅增加计数): INSERT INTO test_upsert as tu(name,status,test_field,identifier, count) VALUES ('shaun',1,'test value','ident', 1) ON CONFLICT …

1
使用xml参数更新多个数据时,如何避免使用合并查询?
我正在尝试使用值数组更新表。数组中的每个项目都包含与SQL Server数据库中的表中的一行相匹配的信息。如果表中已经存在该行,则使用给定数组中的信息更新该行。否则,我们在表中插入新行。我已经基本描述了upsert。 现在,我试图在采用XML参数的存储过程中实现这一目标。我使用XML而不是表值参数的原因是因为这样做,我将不得不在SQL中创建自定义类型并将该类型与存储过程相关联。如果我曾经更改过存储过程或数据库模式中的某些内容,则必须重做存储过程和自定义类型。我想避免这种情况。此外,TVP优于XML的优势对我的情况没有用,因为我的数据数组大小永远不会超过1000。这意味着我无法使用此处提出的解决方案:如何在SQL Server 2008中使用XML插入多个记录 另外,这里的类似讨论(UPSERT-MERGE或@@ rowcount是否有更好的替代方法?)与我要的内容有所不同,因为我试图将多行插入表中。 我希望我可以简单地使用以下查询集从xml向上插入值。但这是行不通的。仅当输入为单行时,才应采用这种方法。 begin tran update table with (serializable) set select * from xml_param where key = @key if @@rowcount = 0 begin insert table (key, ...) values (@key,..) end commit tran 下一个替代方法是使用穷举的IF EXISTS或其以下形式的变体之一。但是,我以效率不佳为由拒绝了这一点: IF (SELECT COUNT ... ) > 0 UPDATE ELSE INSERT 下一个选择是使用Merge语句,如下所述:http …

3
需要帮助解决Sql Server 2005死锁方案
我遇到了一个死锁情况,死锁中唯一的参与者似乎是一个表和一个从该表中删除的存储过程。我根据以下几个死锁时对sql错误日志的分析得出了该结论,并使用下面的MSDN文章作为指导来解密错误日志中的跟踪。 表DEXTable和存储过程ClearDEXTableRows在下面定义。还有另一个存储过程InsertDEXTableRow将行插入DEXTable中,但是基于sql错误日志中的条目,该proc似乎不涉及死锁。 DEXTable具有〜830万行,并且趋于稳定增长。受访者表也很大,并且趋于稳定增长。 可从高流量网站访问该页面,该页面上的页面经常快速连续调用ClearDEXTableRows和InsertDEXTableRow。 在过去的10天里,僵局每天发生0到9次。 我已经为1222启用了SQL跟踪(使用DBCC TRACEON 1222),并且最近才启用了标志1204。在检测和结束死锁上有这些标志的输出的详细说明 我的问题是: 仅此一个存储过程ClearDEXTableRows是造成死锁的原因吗? 如果是这样,谁能提供一个很好的解释,说明如何发生并提出解决方法? 我的怀疑是DELETE语句导致DEXTable PK上的争用,而DEXTable则需要经常重建。 如果不是,我应该启用什么其他跟踪来更深入地了解死锁的原因?(我想在这里学习) -- Table definition CREATE TABLE [dbo].[DEXTable]( [ExportID] [int] NOT NULL, [RespondentID] [int] NOT NULL, [Exported] [datetime] NOT NULL, CONSTRAINT [PK_DEXTable] PRIMARY KEY CLUSTERED ( [ExportID] ASC, [RespondentID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY …

2
PostgreSQL Upsert在分区表上不起作用
有一个这样的表: CREATE TABLE aggregated_master ( "user" BIGINT, type TEXT, date TIMESTAMP, operations BIGINT, amount NUMERIC, PRIMARY KEY ( "user", type, date ) ); 该表是从中继承许多分区的主表。分区由DATE字段中的MONTH完成。例如:2017年8月的分区将是agg_201708,它的PK将是pk_agg_201708。在插入之前,通常有触发器将插入重定向到适当的分区。 事情是我想对这张表做一个UPSERT。DO CONFLICT部分不起作用。 代码首先是这样的 INSERT INTO aggregated_master (user, type, date, oeprations, amount) SELECT user, type, date, SUM(ops), SUM(amt) FROM ... WHERE ... GROUP BY USER, TYPE, DATE …

1
为什么CTE对丢失的更新开放?
当克雷格·林格(Craig Ringer)评论时,我不明白他的意思: 如果插入事务回滚,则此解决方案可能会丢失更新。没有检查来强制UPDATE影响任何行。 在https://stackoverflow.com/a/8702291/14731上。请提供事件的样本序列(例如,线程1执行X,线程2执行Y),以演示丢失更新的发生方式。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.