标签: upsert

在SQL Server 2008 MERGE语法中使用什么?

雅各布问了一个完美的问题:给我MERGE语法.

那里的每一个答案都会立即跳到他们能想到的最复杂的案例中; 用无关的混淆来掩盖语法.

马克给出了答案:

MERGE 
   member_topic AS target
USING 
   someOtherTable AS source
ON 
   target.mt_member = source.mt_member 
   AND source.mt_member = 0 
   AND source.mt_topic = 110
WHEN MATCHED THEN 
   UPDATE SET mt_notes = 'test'
WHEN NOT MATCHED THEN 
   INSERT (mt_member, mt_topic, mt_notes) VALUES (0, 110, 'test')
; 
Run Code Online (Sandbox Code Playgroud)

看着这个答案,我和雅各布一样困惑:

我没有someOtherTable

Marc建议这someOtherTable是一个虚拟的占位符值 - 没有那个表并不重要.

我尝试了,SQL Server 确实抱怨

无效的对象名称'someOtherTable'.

这使我努力理解什么USINGUSING foo,如果它不是重要的(除了实际上很重要).

是什么USING时,它的使用使用时我使用SQL Server 2008合并语法?


奖金问题

什么是使用MERGE的UPSERT语法: …

sql-server merge upsert sql-server-2008-r2

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

实体框架 - 独特索引上的UPSERT

我搜索了一下我的问题,但找不到任何真正有用的东西.

所以我的问题/困境保持这样:我知道mysql数据库有一个唯一的索引系统,可以使用这种格式在同一查询中插入/更新: insert into t(a,b,c) values(1,1,1) on duplicate keys update b=values(b),c=values(c); 以及用于替换该索引的现有记录的替换格式.

说实话,我在MSSQL中看到的唯一类似的东西是,merge但我真的不喜欢它,并且验证插入或更新的查询根本不是唯一的索引...

那么如何将mysql独特的UPSERT模拟到Entity Framework中呢?这是我的主要问题......

我的意思是没有从实体集中获取记录并检查它是否为null或者是否为可能的插入或更新;

我能得到它吗?或不?任何提示都可能有用

我看到了这个,但没有出现在版本6中......

实体的例子:

    [Table("boats")]
    public class Boat
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int id { get; set; }
        [MaxLength(15)]
        [Index("IX_ProviderBoat",1,IsUnique=true)]
        public string provider_code { get; set; }
        public string name { get; set; }
        [Index("IX_ProviderBoat", 3, IsUnique = true)]
        [MaxLength(50)]
        public string model { get; set; }
        [Index("IX_ProviderBoat", 2, IsUnique = true)]
        [MaxLength(15)]
        [Key]
        public string boat_code { get; set; }
        public …
Run Code Online (Sandbox Code Playgroud)

c# sql entity-framework upsert

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

更新路径'x'会在'x'处产生冲突

我尝试更新upsert项时发生此错误: Updating the path 'x' would create a conflict at 'x'

upsert mongodb

20
推荐指数
5
解决办法
5430
查看次数

检查记录是否存在,如果是,则"更新",如果不是"插入"

如果没有用于插入表的记录,我想检查表PREMIUM_SERVICE_USER是否存在 strClientID更新timeValid+30的记录.strClientIDpremium_service_user

我究竟做错了什么?

它增加timeValid了+30天,但也插入了另一行.

SELECT @pre_var = count(*) 
FROM PREMIUM_SERVICE_USER 
WHERE strClientID = @strClientID

/* bronze premium - 200 cash */
IF @Premium = 1
BEGIN
    INSERT INTO PREMIUM_SERVICE_USER 
        (strClientID, timeReg, timeValid, bCurrent, durum) 
    VALUES 
        (@strClientID,getdate(),getdate() + 30,'1','1')

    UPDATE TB_USER 
    SET cash = cash+200 
    WHERE strAccountID = @strClientID
END

IF @Premium = 1 AND @pre_var = 1
BEGIN
    UPDATE PREMIUM_SERVICE_USER 
        SET timevalid = timevalid+30 where strClientID = @strClientID
    UPDATE PREMIUM_SERVICE_USER 
        SET …
Run Code Online (Sandbox Code Playgroud)

sql-server merge stored-procedures sql-server-2000 upsert

19
推荐指数
2
解决办法
7万
查看次数

使用Hibernate基于唯一键查找或插入

我正在尝试编写一个方法,它将返回一个基于唯一但非主键的Hibernate对象.如果实体已存在于数据库中,我想返回它,但如果不存在,我想创建一个新实例并在返回之前保存它.

更新:让我澄清一下,我正在编写的应用程序基本上是输入文件的批处理器.系统需要逐行读取文件并将记录插入数据库.文件格式基本上是我们模式中几个表的非规范化视图,所以我要做的是解析父记录,或者将其插入到db中,这样我就可以得到一个新的合成密钥,或者如果它已经存在则选择它.然后我可以在其他表中添加其他关联记录,这些表具有返回该记录的外键.

这很棘手的原因是每个文件需要完全导入或根本不导入,即为给定文件完成的所有插入和更新应该是一个事务的一部分.如果只有一个进程正在执行所有导入,这很容易,但是如果可能的话,我想在多个服务器上解决这个问题.由于这些约束,我需要能够保留在一个事务中,但是处理已经存在记录的异常.

父记录的映射类如下所示:

@Entity
public class Foo {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    private int id;
    @Column(unique = true)
    private String name;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我最初尝试编写此方法的方法如下:

public Foo findOrCreate(String name) {
    Foo foo = new Foo();
    foo.setName(name);
    try {
        session.save(foo)
    } catch(ConstraintViolationException e) {
        foo = session.createCriteria(Foo.class).add(eq("name", name)).uniqueResult();
    }
    return foo;
}
Run Code Online (Sandbox Code Playgroud)

问题是当我正在寻找的名称存在时,调用uniqueResult()会抛出org.hibernate.AssertionFailure异常.完整的堆栈跟踪如下:

org.hibernate.AssertionFailure: null id in com.searchdex.linktracer.domain.LinkingPage entry (don't flush the Session after an exception occurs)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:82) [hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:190) [hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:147) [hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219) [hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at …
Run Code Online (Sandbox Code Playgroud)

java hibernate upsert unique-key unique-constraint

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

AddOrUpdate工作不符合预期,并产生重复

我正在使用基于Code-First DBContext的EF5设置.

DbMigrationsConfiguration.Seed我试图用默认的虚拟数据填充数据库.为了完成这个任务,我使用DbSet.AddOrUpdate方法.

最简单的代码来说明我的目标:

j = 0;

var cities = new[]
    {
        "Berlin",
        "Vienna",
        "London",
        "Bristol",
        "Rome",
        "Stockholm",
        "Oslo",
        "Helsinki",
        "Amsterdam",
        "Dublin"
    };
var cityObjects = new City[cities.Length];


foreach (string c in cities)
{
    int id = r.NextDouble() > 0.5 ? 0 : 1;
    var city = new City
        {
            Id = j,
            Name = c,
            Slug = c.ToLowerInvariant(),
            Region = regions[id],
            RegionId = regions[id].Id,
            Reviewed = true
        };
    context.CitySet.AddOrUpdate(cc => cc.Id, city);
    cityObjects[j] = city; …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework upsert entity-framework-5

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

多个UNIQUE字段的ON DUPLICATE KEY UPDATE的MySQL行为

从MySQL 4.1.0开始,ON DUPLICATE KEY UPDATE当插入的值(带INSERTSETVALUES)已经在目标表wrt PRIMARY KEY或某个UNIQUE字段中时,可以添加语句来指定行为.如果PRIMARY KEY某个UNIQUE字段的值已经在表中,INSERT则替换为UPDATE.

  • ON DUPLICATE KEY UPDATE如果UNIQUE我的表中有多个字段,表现 如何?

  • 如果两个UNIQUE字段匹配,我可以只有一个更新吗?

  • 只有当两个UNIQUE字段同时匹配时才能更新吗?

mysql upsert sql-update sql-insert

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

如何使用mongodb-java-driver进行upsert

如何使用java-driver将数据插入mongodb集合?

我尝试(空收集):

db.getCollection(collection).update(new BasicDBObject("_id", "12"), dbobject, true, false);
Run Code Online (Sandbox Code Playgroud)

但文档是使用_id == ObjectID(...)创建的.不是"12"值.

此代码(js)按预期添加_id ="12"的文档

db.metaclass.update(
   { _id:12},
   {
     $set: {b:1}
   },
   { upsert: true }
)
Run Code Online (Sandbox Code Playgroud)

蒙戈-java的驱动程序2.11.2

java upsert mongodb

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

golang中的sql事务中的批量upsert

我一直在搞乱golang的sql包与事务,我试图了解如何进行批量upserts而没有每行的"每次插入"往返通信.这里示例并未真正显示如何进行批量查询.

updateMoney, err := db.Prepare("INSERT INTO balance set money=?, id=? ON DUPLICATE UPDATE balance SET money=money+? WHERE id=?")
...
tx, err := db.Begin()
...
res, err := tx.Stmt(updateMoney).Exec(123.45, 1, 123.45, 1)
res, err := tx.Stmt(updateMoney).Exec(67.89, 2, 67.89, 2)
res, err := tx.Stmt(updateMoney).Exec(10.23, 3, 10.23, 3)
...
tx.Commit()
Run Code Online (Sandbox Code Playgroud)

理想情况下,我可以进行准备好的查询,并建立一个同时发送的upserts列表......但是在这里,我们在每次执行后从数据库中得到一个结果.关于如何解决这个问题的任何建议?

编辑:我的同事找到了这张描述问题的开放票证 ......它看起来比一个交易环境中的严格问题更严重.

sql transactions bulkinsert upsert go

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

MongoDB:Update/Upsert vs Insert

最近我注意到在进行多次upsert(通过批量操作)和插入(多个文档)之间存在巨大的性能差异.我想知道我是否正确对待这个问题:

  • Upsert/Updates就像a一样find(),update()它可以读取和写入2个内容
  • 插入只会写得更快

那性能差异呢?

如果是这种情况,我想知道我是否经常需要大量写入,而不是更新文档,我用一个createdOn字段编写一个新文档.然后查询,我将只查询文件,排序依据createdOn DESC.我想知道这是一个好方法吗?或者,还有更好的方法?

  • 我想知道我是否有关于该集合的索引,是否可以加快更新速度?但是这个索引不会减慢写入部分的速度吗?
  • 在第二种方式,我只进行插入,它会减慢然后我有太多的文件?它是否实用(加快写入速度)?
  • 我也尝试过增加连接池大小.不确定什么是最佳的,但我试过20,我看到我可以通过mongostat处理每秒20次查询.我预计它会更高.

upsert mongodb mongodb-query

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