我正在写一个DB层,它可以与MS SQL Server,MySQL和甲骨文对话。我需要一个操作,可以更新现有的行,如果它包含某些数据,否则插入一个新行;所有在一个SQL操作。
从本质上讲,我需要保存现有的数据,如果它存在,或者添加它,如果它不存在
从概念上讲,这与upsert相同,只是它只需要在单个表上工作。我正在尝试确保我不需要删除然后插入,因为这会影响性能。
有没有通用的SQL来做这件事,或者我需要特定于供应商的解决方案?
谢谢。
发布于 2012-09-21 18:54:56
您需要特定于供应商的SQL,因为MySQL (与MS和Oracle不同)不支持MERGE
http://en.wikipedia.org/wiki/Merge_(SQL
我怀疑,您很快就会需要一个特定于供应商的DB层实现- SQL可移植性几乎是一个神话,只要您做了任何事情,即使是稍微先进的。
发布于 2012-09-21 18:55:11
我非常确定这将是特定于供应商的。对于SQL Server,可以使用MERGE语句完成此操作。
发布于 2012-09-21 18:58:12
如果您使用的是SQL Server2008,请使用Merge语句。但请记住,如果您的插入部分包含某些条件,则不能使用它。在这种情况下,您需要编写自己的方式来完成此任务。在您的例子中,它必须是这样的,因为您涉及的是没有Merge语句的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;
}https://stackoverflow.com/questions/12529130
复制相似问题