标签: upsert

MERGE语法用于在重复UPDATE上进行UPSERT或INSERT

所以我来自MySQL,我可以在DUPLICATE UPDATE进行INSERT:

INSERT INTO table (a,b,c) 
VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
Run Code Online (Sandbox Code Playgroud)

但是现在我正在使用PostgreSQL,并且努力添加UPSERT功能,看起来MERGE可能适用于我想要的但想看看这是否是最优化的语法.示例语法1,我也看过这个,但不明白如何实现.我还没有尝试过这个,因为我认为MERGE用于合并从table1到Table2的数据或者这样的工作?

MERGE
INTO    table
USING   table
ON      c = 1
WHEN MATCHED THEN
UPDATE
SET     c=c+1
WHEN NOT MATCHED THEN
INSERT  (a,b,c)
VALUES  (1,2,3)
Run Code Online (Sandbox Code Playgroud)

还有其他建议吗?

sql postgresql upsert

8
推荐指数
1
解决办法
2万
查看次数

如何仅在不存在的情况下创建记录,避免重复并且不会引发任何错误?

众所周知,Model.find_or_create_by(X)实际上:

  1. 由X选择
  2. 如果找不到 - >由X创建
  3. 返回记录(找到或创建)

在步骤1和2之间可能存在争用条件.为了避免数据库中的X重复,应该在X的字段集上使用唯一索引.但是如果应用唯一索引,那么竞争事务之一将失败异常(尝试创建X的副本时).

如何实现"安全版本",#find_or_create_by它永远不会引发任何异常并始终按预期工作?

postgresql transactions ruby-on-rails upsert rails-activerecord

8
推荐指数
1
解决办法
5834
查看次数

如何使用talend和sql server更快地加载数据

我使用Talend将数据加载到sql-server数据库中.

看来我工作中最薄弱的部分不是数据处理,而是数据库中的有效负载,不超过17行/秒.

有趣的一点是,我可以同时启动5个工作,并且它们都将以17个/秒的速度加载.

什么可以解释这种缓慢,我怎样才能提高速度?

谢谢

新信息:

我的桌面和服务器之间的传输速度大约是1MByte

我的工作每10 000工作一次

我使用sql server 2008 R2

我用于工作的模式是这样的:

在此输入图像描述

sql-server upsert database-performance talend

8
推荐指数
2
解决办法
3万
查看次数

从条件INSERT中获取Id

对于像这样的表:

CREATE TABLE Users(
    id SERIAL PRIMARY KEY,
    name TEXT UNIQUE
);
Run Code Online (Sandbox Code Playgroud)

以下操作的正确单一查询插入是什么:

给定用户name,插入新记录并返回新记录id.但如果name已经存在,只需返回id.

我知道PostgreSQL 9.5中的新语法ON CONFLICT(column) DO UPDATE/NOTHING,但我无法弄清楚,如果有的话,它可以提供帮助,因为我需要id返回.

这似乎RETURNING idON CONFLICT不属于一起.

sql postgresql concurrency upsert

8
推荐指数
1
解决办法
1893
查看次数

带有 WHERE 子句的 PostgreSQL ON CONFLICT

Postgres 文档使它看起来像 WHERE 子句可以作为 ON CONFLICT 条件:https : //www.postgresql.org/docs/9.5/static/sql-insert.html

我一直无法让它工作(如果可能的话)。这是我尝试过的众多排列之一:

INSERT INTO friends (id, dob, frn, status, "groupId", 
"createdAt", "updatedAt") 
VALUES ('1da04305-68ef-4dc1-be6c-
826ab83a6479', '1937-06-01T08:29:08-07:00', 100001, 'New', 'bc1567bc-
14ff-4ba2-b108-4cb2e0f0f768', NOW(), NOW()) 
ON CONFLICT 
    WHERE frn=100001 DO NOTHING
Run Code Online (Sandbox Code Playgroud)

frn 没有任何约束,所以语法更简单:

ON CONFLICT (frn) DO NOTHING
Run Code Online (Sandbox Code Playgroud)

引发数据库错误。我希望这是一个简单的语法问题。

sql postgresql upsert sql-insert

8
推荐指数
1
解决办法
1万
查看次数

SQL Server自定义计数器存储过程创建dupes

我创建了一个存储过程来对我的API实现速率限制,每秒调用大约5-10k次,每天我都注意到计数器表中的dupes.

在此输入图像描述

它查找传入的API密钥,然后使用"UPSERT"检查带有ID和日期组合的计数器表,如果找到结果,则执行UPDATE [count] +1,如果不是,则会插入新行.

计数器表中没有主键.

这是存储过程:

USE [omdb]
GO
/****** Object:  StoredProcedure [dbo].[CheckKey]    Script Date: 6/17/2017 10:39:37 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[CheckKey] (
@apikey AS VARCHAR(10)
)
AS
BEGIN

SET NOCOUNT ON;

DECLARE @userID as int
DECLARE @limit as int
DECLARE @curCount as int
DECLARE @curDate as Date = GETDATE()

SELECT @userID = id, @limit = limit FROM [users] WHERE apiKey = @apikey

IF @userID IS NULL
    BEGIN
        --Key not found
        SELECT …
Run Code Online (Sandbox Code Playgroud)

sql-server counter stored-procedures upsert

8
推荐指数
1
解决办法
1212
查看次数

Mongoose' findOneAndUpdate 和 upsert 中的重复键错误

当来自我的 csv 文件的输入有两行或更多行具有相同的电子邮件地址时,我在使用 findOneAndUpdate 时遇到了一些问题。电子邮件地址在我的模型中设置为唯一,我认为 findOneAndUpdate 可以让我处理 csv 文件中的重复。代码如下。在这里阅读这是因为我的查询中的字段(在本例中为电子邮件)也是我要创建的字段之一,以防找不到记录。我不确定这是否属实。无论如何,电子邮件是我的标识符,所以它必须在那里。

更详细地解释这种行为:

  1. 当 csv 文件包含在我运行脚本之前已经存储在 MongoDB 中的电子邮件地址时, findOneAndUpdate 可以完美运行
  2. 但是,当我在 csv 文件中有两条记录共享相同的电子邮件地址但在运行脚本之前没有该电子邮件地址的记录存储在 MongoDB 中时,我有时会收到像这样的重复键错误 { MongoError: E11000 duplicate key error collection: db.accounts index: email_1 dup key: { : "xxxxx@yahoo.com" }
  3. 有时会在上面写,因为有时(虽然不太频繁)我不这样做,而且一切都按原样进行。

代码:

for (let i = 0; i < accounts.length; i++) {
   let query = {'email': accounts[i].email};
   let accountHolderDoc = {
       email: accounts[i].email,
       name: {
         first: accounts[i].accountHolderFName,
         last: accounts[i].accountHolderLName,
       },
    };

    promise = AccountHolder
        .findOneAndUpdate(
            query, {$set: accountHolderDoc}, …
Run Code Online (Sandbox Code Playgroud)

javascript asynchronous upsert mongoose mongodb

8
推荐指数
1
解决办法
3851
查看次数

具有多列唯一约束名称的 PostgreSQL ON CONFLICT

我在尝试UPSERT使用 PostgreSQL时遇到了我不明白的行为。该文件似乎表明,冲突的目标中的INSERT语句可以是一个索引表达式约束的名称。但是,当尝试引用约束名称时,出现“列...不存在”错误。

我的第一次尝试是创建一个UNIQUE索引,它可以很好地与约束推断配合使用:

create table kv (key text, value text, extra text);
create unique index kv_key_value on kv(key, value);
insert into kv (key, value) values ('k1', 'v1');
-- this works:
insert into kv (key, value, extra) values ('k1', 'v1', 'e1')
  on conflict (key, value) do update set extra=excluded.extra;

-- this does not
insert into kv (key, value, extra) values ('k1', 'v1', 'e1')
  on conflict (kv_key_value) do update set extra=excluded.extra;
Run Code Online (Sandbox Code Playgroud)

描述上表,我在“索引”下看到以下内容: …

sql postgresql upsert

8
推荐指数
1
解决办法
4697
查看次数

如何使用jpa存储库saveAll忽略保存操作的重复插入?

我需要能够使用 spring 数据 CrudRepository 的 saveAll() 方法并忽略对唯一约束的重复插入。

在我当前的项目中,我目前正在使用 spring boot -> jpa stack,我必须处理一个 excel 文件的导入,该文件最终将多个实体保存到数据库中。我正在使用 liquibase 来跟踪数据库上的更改,并且我正在使用 spring 配置文件来管理两种不同的环境(一种使用 Postgres DB,另一种使用 Oracle 19-c)。excel 文件不时通过外部 ftp 服务上传。我有一个文件夹监视服务,它等待该文件夹中的文件更改并在创建新文件时触发导入。

问题是我有一个唯一的约束,文件可能有新行和旧行。通过 POI 对 Excel 文件的处理非常繁重,我通过 java.util.Set 将计算结果保存在内存中,直到到达必须使用 saveAll() 方法保存 Set 的时间点CrudRepository。

我目前遇到错误:重复键值违反唯一约束“csspd_avoid_duplicates”

org.springframework.transaction.UnexpectedRollbackException:事务静默回滚,因为它已被标记为仅回滚

并且导入在第一个遇到的重复项上停止。

对于同一个项目,我在循环中的单个插入(单个 save())中遇到了类似的问题,我已经设法使用以下代码段解决了该问题:

                try {

                    repository.save(entity);
                } catch (DataIntegrityViolationException e) {
                    this.log.debug("Duplicate found, skipping");
                }
Run Code Online (Sandbox Code Playgroud)

我已经尝试了与批量保存相同的方法,但没有任何运气。

这是感兴趣的方法:

public boolean triggerExcelImport(Path path) {
    try {

        ExcelDataDTO excelExtractedData;
        if (path == null) {
            excelExtractedData = excelImporterService.importExcelFiles();
        } else {
            excelExtractedData = …
Run Code Online (Sandbox Code Playgroud)

java exception jdbc upsert spring-data-jpa

8
推荐指数
1
解决办法
4494
查看次数

DynamoDB Upsert - 更新还是创建?

我们使用 DynamoDB UpdateItem

正如我们可以从文档中了解到的那样,这充当“更新插入”

编辑现有项目的属性,或者将新项目添加到表中(如果尚不存在)。[...]

当我们发出请求时,为了确定是否创建了某个项目或更新了现有项目,我们请求ALL_OLD。这非常有效,可以让我们区分updatecreate

作为附加要求,我们还想返回ALL_NEW,但仍然知道所执行的操作类型。

问题:这可以在单个请求中完成吗?还是我们必须发出第二个(获取)请求?

upsert amazon-web-services amazon-dynamodb

8
推荐指数
1
解决办法
2万
查看次数