所以我来自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)
还有其他建议吗?
众所周知,Model.find_or_create_by(X)实际上:
在步骤1和2之间可能存在争用条件.为了避免数据库中的X重复,应该在X的字段集上使用唯一索引.但是如果应用唯一索引,那么竞争事务之一将失败异常(尝试创建X的副本时).
如何实现"安全版本",#find_or_create_by它永远不会引发任何异常并始终按预期工作?
postgresql transactions ruby-on-rails upsert rails-activerecord
我使用Talend将数据加载到sql-server数据库中.
看来我工作中最薄弱的部分不是数据处理,而是数据库中的有效负载,不超过17行/秒.
有趣的一点是,我可以同时启动5个工作,并且它们都将以17个/秒的速度加载.
什么可以解释这种缓慢,我怎样才能提高速度?
谢谢
新信息:
我的桌面和服务器之间的传输速度大约是1MByte
我的工作每10 000工作一次
我使用sql server 2008 R2
我用于工作的模式是这样的:

对于像这样的表:
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 id与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)
引发数据库错误。我希望这是一个简单的语法问题。
我创建了一个存储过程来对我的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) 当来自我的 csv 文件的输入有两行或更多行具有相同的电子邮件地址时,我在使用 findOneAndUpdate 时遇到了一些问题。电子邮件地址在我的模型中设置为唯一,我认为 findOneAndUpdate 可以让我处理 csv 文件中的重复。代码如下。在这里阅读这是因为我的查询中的字段(在本例中为电子邮件)也是我要创建的字段之一,以防找不到记录。我不确定这是否属实。无论如何,电子邮件是我的标识符,所以它必须在那里。
更详细地解释这种行为:
{ MongoError: E11000 duplicate key error collection: db.accounts index: email_1 dup key: { : "xxxxx@yahoo.com" }代码:
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) 我在尝试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)
描述上表,我在“索引”下看到以下内容: …
我需要能够使用 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) 我们使用 DynamoDB UpdateItem。
正如我们可以从文档中了解到的那样,这充当“更新插入”
编辑现有项目的属性,或者将新项目添加到表中(如果尚不存在)。[...]
当我们发出请求时,为了确定是否创建了某个项目或更新了现有项目,我们请求ALL_OLD。这非常有效,可以让我们区分update和create。
作为附加要求,我们还想返回ALL_NEW,但仍然知道所执行的操作类型。
问题:这可以在单个请求中完成吗?还是我们必须发出第二个(获取)请求?
upsert ×10
postgresql ×5
sql ×4
sql-server ×2
asynchronous ×1
concurrency ×1
counter ×1
exception ×1
java ×1
javascript ×1
jdbc ×1
mongodb ×1
mongoose ×1
sql-insert ×1
talend ×1
transactions ×1