标签: upsert

如何使用C#驱动程序在MongoDB中更新和升级多个文档

我正在使用MongoDB 2,我想更新多个文档并将一个值processed:true 插入到集合中.但MongoDB c#api只允许我们更新多个记录或Upsert一条记录.

如何使用C#api解决这个问题?

upsert mongodb

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

MERGE是SQL2008中的原子语句吗?

我使用MERGE声明作为UPSERT添加新记录或更新当前记录.我有多个线程通过多个连接和多个语句驱动数据库(每个线程一个连接和语句).我一次批处理语句50.

duplicate key在考试期间遇到违规行为,我感到非常惊讶.我希望这是不可能的,因为MERGE它将作为单个交易执行,或者是它?

我的Java代码如下:

private void addBatch(Columns columns) throws SQLException {
  try {
    // Set parameters.
    for (int i = 0; i < columns.size(); i++) {
      Column c = columns.get(i);
      // Column type is an `enum` with a `set` method appropriate to its type, e.g. setLong, setString etc.
      c.getColumnType().set(statement, i + 1, c.getValue());
    }
    // Add the insert as a batch.
    statement.addBatch();
    // Ready to execute?
    if (++batched >= MaxBatched) {
      statement.executeBatch(); …
Run Code Online (Sandbox Code Playgroud)

java sql upsert sql-server-2008

13
推荐指数
1
解决办法
5616
查看次数

如何引用在ON CONFLICT中使用函数的唯一索引?

我正在使用postgres 9.5.3,我有一个这样的表:

CREATE TABLE packages (
  id   SERIAL PRIMARY KEY,
  name VARCHAR NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

我已定义了一个函数canonical_name,如下所示:

CREATE FUNCTION canonical_name(text) RETURNS text AS $$
    SELECT replace(lower($1), '-', '_')
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)

我在这个表中添加了一个使用该函数的唯一索引:

CREATE UNIQUE INDEX index_package_name
ON packages (canonical_name(name));
CREATE INDEX
# \d+ packages
                                                  Table "public.packages"
 Column |       Type        |                       Modifiers                       | Storage  | Stats target | Description
--------+-------------------+-------------------------------------------------------+----------+--------------+-------------
 id     | integer           | not null default nextval('packages_id_seq'::regclass) | plain    |              |
 name   | character varying | not null                                              | …
Run Code Online (Sandbox Code Playgroud)

postgresql upsert

13
推荐指数
1
解决办法
3165
查看次数

如何使用NHibernate插入或更新(或覆盖)记录?

我需要在数据库中写一行,无论它是否已经存在.在使用NHibernate之前,这是通过存储过程完成的.该过程将尝试更新,如果没有修改行,它将回退到插入.这很好用,因为应用程序不关心记录是否存在.

使用NHibernate,我发现的解决方案需要加载实体并对其进行修改,或删除实体以便插入新实体.如果记录已经存在,应用程序必须关心.有办法吗?

Id是否重要?

已分配的ID

该对象具有关键字作为分配的ID,并且是表中的主键.

据我所知,SaveOrUpdate()将根据Id调用Save()或Update()方法.使用指定的ID,这将不起作用,因为id不是未保存的值.但是,版本或时间戳字段可以用作指示符.实际上,这是不相关的,因为这只反映了内存中的对象是否与数据库中的记录相关联; 它不表示数据库中是否存在记录.

生成的ID

如果分配的id确实是问题的原因,我可以使用生成的id而不是关键字作为主键.这将避免NHibernate插入/更新问题,因为它实际上总是插入.但是,我仍然需要防止重复的关键字.使用关键字列上的唯一索引,即使主键不同,它仍会为重复关键字抛出异常.

另一种方法?

也许问题不在于NHibernate,而在于它的建模方式.与应用程序的其他区域不同,这是以数据为中心而非以对象为中心的.NHibernate很容易读/写并消除了存储过程.但是,在不考虑现有值的情况下简单编写的愿望并不适合对象的身份模型的模型.有没有更好的方法来解决这个问题?

nhibernate upsert overwrite insert-update

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

mongodb - 如果不存在则创建doc,否则推送到数组

我有一份以下表格的文件:

{
"_id" : ObjectId("4d2d8deff4e6c1d71fc29a07"),
"user_id" : "714638ba-2e08-2168-2b99-00002f3d43c0",
"events" : [
        {
                "profile" : 10,
                "data" : "....."
        }
        {
                "profile" : 10,
                "data" : "....."
        }
        {
                "profile" : 20,
                "data" : "....."
        }
        ...
   ]
 }
Run Code Online (Sandbox Code Playgroud)

我想upsert发表一些声明.它需要一个添加eventevents阵列user_id中的情况下,已经有这样的文档存在,否则就需要创建与该文档event项.

可以这样做吗?

arrays upsert mongodb

12
推荐指数
1
解决办法
9929
查看次数

如何在Sequel数据集上更新或插入?

我刚开始在一个非常小的Sinatra应用程序中使用Sequel.由于我只有一个数据库表,所以我不需要使用模型.

我想更新记录(如果存在)或插入新记录(如果不存在).我提出了以下解决方案:

  rec = $nums.where(:number => n, :type => t)
  if $nums.select(1).where(rec.exists)
    rec.update(:counter => :counter + 1)
  else
    $nums.insert(:number => n, :counter => 1, :type => t)
  end
Run Code Online (Sandbox Code Playgroud)

哪里$numsDB[:numbers]数据集.

我相信这种方式不是"更新或插入"行为的最优雅实现.

应该怎么做?

ruby upsert sequel

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

Postgres - ON CONFLICT - 如何知道是否发生UPDATE而不是INSERT

我有一张桌子

CREATE TABLE foo
(
    f0 int,
    time_stamp timestamp,
    CONSTRAINT foo_pk PRIMARY KEY (f0)
)
Run Code Online (Sandbox Code Playgroud)

我需要大量写入此表,因此性能是关键.有时,我会写一个具有现有值的记录,f0并且只会更新time_stamp到当前时间.为此,我使用了一个ON CONFLICT..DO UPDATE条款.

问题是我需要知道是否INSERT已经发生或是UPDATE.

我虽然使用第二is_update列.插入,插入false

`ON CONFLICT .. DO UPDATE set is_update=true`
Run Code Online (Sandbox Code Playgroud)

然后RETURNING is_update用来得到我想要的东西.问题在于引入了与数据本身无关的附加列.

sql postgresql upsert postgresql-9.5

12
推荐指数
2
解决办法
2106
查看次数

如何在PostgreSQL中嵌入多行

我正在尝试在PostgreSQL 9.5.2中编写这样的查询:

INSERT INTO a (id, x)
    SELECT id, x FROM b
ON CONFLICT (id) DO UPDATE
    SET x = b.x
    WHERE b.y < 100
Run Code Online (Sandbox Code Playgroud)

但我明白了ERROR: missing FROM-clause entry for table "b".我必须遗漏一些基本的东西,但是如何引用UPDATE子句中插入的行?或者还有其他方式吗?

postgresql upsert postgresql-9.5

12
推荐指数
1
解决办法
4108
查看次数

如何在 sqlite 中使用 ON CONFLICT IGNORE

如果标签和 url 组合已存在,我会尝试忽略插入:

INSERT INTO tags(tag, url) VALUES (?, ?); 
              ON CONFLICT(url, tag) IGNORE 
Run Code Online (Sandbox Code Playgroud)

我有一个唯一索引(tag, url)

    CREATE UNIQUE INDEX tag_url ON tags (tag, url)
Run Code Online (Sandbox Code Playgroud)

该应用程序只是崩溃说[uncaught application error]: SqliteError - UNIQUE constraint failed: tags.tag, tags.url

sqlite upsert sql-insert

12
推荐指数
1
解决办法
9107
查看次数

使用python在Elasticseach中批量部分Upsert

我想向ES发送n个upsert部分请求,这样的事情可能吗?因此,如果文档不存在,请插入我的部分文档.如果它已存在,请使用部分doc更新它.

使用批量助手,我尝试了很多变化,但它们都消除了现有的价值,转而支持新的价值.

data = [{
    "_index": 'my_index',
    "_type": 'my_type',
    "_id": 12345,
    "doc": {"newkey": 'newvalue'}
}]
helpers.bulk(es, data, index='my_index', doc_type='my_type')
Run Code Online (Sandbox Code Playgroud)

要么

data = [{
    "_index": 'my_index',
    "_type": 'my_type',
    "_id": 12345,
    "_source": {"newkey": 'newvalue'}
}]
helpers.bulk(es, data, index='my_index', doc_type='my_type')
Run Code Online (Sandbox Code Playgroud)

也不起作用.

python upsert elasticsearch

11
推荐指数
2
解决办法
2814
查看次数