雅各布问了一个完美的问题:给我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'.
这使我努力理解什么USING的USING foo是对,如果它不是重要的(除了实际上很重要).
是什么USING时,它的使用使用富时我使用SQL Server 2008合并语法?
什么是使用MERGE的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) 我尝试更新upsert项时发生此错误:
Updating the path 'x' would create a conflict at 'x'
如果没有用于插入表的记录,我想检查表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) 我正在尝试编写一个方法,它将返回一个基于唯一但非主键的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) 我正在使用基于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) 从MySQL 4.1.0开始,ON DUPLICATE KEY UPDATE当插入的值(带INSERT或SET或VALUES)已经在目标表wrt PRIMARY KEY或某个UNIQUE字段中时,可以添加语句来指定行为.如果PRIMARY KEY某个UNIQUE字段的值已经在表中,INSERT则替换为UPDATE.
ON DUPLICATE KEY UPDATE如果UNIQUE我的表中有多个字段,表现
如何?
如果两个UNIQUE字段匹配,我可以只有一个更新吗?
只有当两个UNIQUE字段同时匹配时才能更新吗?
如何使用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
我一直在搞乱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列表......但是在这里,我们在每次执行后从数据库中得到一个结果.关于如何解决这个问题的任何建议?
最近我注意到在进行多次upsert(通过批量操作)和插入(多个文档)之间存在巨大的性能差异.我想知道我是否正确对待这个问题:
find(),update()它可以读取和写入2个内容那性能差异呢?
如果是这种情况,我想知道我是否经常需要大量写入,而不是更新文档,我用一个createdOn字段编写一个新文档.然后查询,我将只查询文件,排序依据createdOn DESC.我想知道这是一个好方法吗?或者,还有更好的方法?
upsert ×10
mongodb ×3
c# ×2
java ×2
merge ×2
sql ×2
sql-server ×2
bulkinsert ×1
go ×1
hibernate ×1
mysql ×1
sql-insert ×1
sql-update ×1
transactions ×1
unique-key ×1