我正在编写一个与MS SQL Server,MySQL& amp;甲骨文。我需要一个操作,如果它包含某些数据,可以更新现有的行,否则插入一个新行;一体化SQL操作。
基本上我需要保存现有数据(如果存在),或者如果不存在则添加
从概念上讲,这与upsert相同,只是它只需要在单个表上工作。我正在努力确保我不需要删除然后插入,因为这会对性能产生影响。
是否有通用SQL来执行此操作,还是需要特定于供应商的解决方案?
感谢。
答案 0 :(得分:3)
您需要特定于供应商的SQL,因为MySQL(与MS和Oracle不同)不支持MERGE
http://en.wikipedia.org/wiki/Merge_(SQL)
我怀疑,不久之后,您将需要特定于供应商的数据库层实现 - 只要稍微提高一点,SQL可移植性就是一个神话。
答案 1 :(得分:1)
我很确定这将是特定于供应商的。对于SQL Server,您可以使用MERGE语句完成此操作。
答案 2 :(得分:1)
如果您使用的是SQL Server 2008,请使用Merge Statement。但请记住,如果您的插入部分涉及某些条件,则无法使用它。在这种情况下,您需要编写自己的方式来完成此操作。在你的情况下,它必须是因为你涉及没有合并声明的MySQL。
为什么不为此目的使用ORM层(如实体框架)?
只是一些伪代码(在C#中)
public int SaveTask(tblTaskActivity task, bool isInsert)
{
int result = 0;
using (var tmsEntities = new TMSEntities())
{
if (isInsert) //for insert
{
tmsEntities.AddTotblTaskActivities(task);
result = tmsEntities.SaveChanges();
}
else //for update
{
var taskActivity = tmsEntities.tblTaskActivities.Where(i => i.TaskID == task.TaskID).FirstOrDefault();
taskActivity.Priority = task.Priority;
taskActivity.ActualTime = task.ActualTime;
result = tmsEntities.SaveChanges();
}
}
return result;
}
答案 3 :(得分:0)