我正在编写一个与 MS SQL Server、MySQL 和 Oracle 对话的数据库层。我需要一个操作,如果它包含某些数据,它可以更新现有行,否则插入一个新行;一站式 SQL 操作。
本质上,如果存在,我需要保存现有数据,如果不存在,则添加它
从概念上讲,这与 upsert 相同,只是它只需要在单个表上工作。我试图确保我不需要删除然后插入,因为这会影响性能。
是否有通用 SQL 来执行此操作,还是我需要供应商特定的解决方案?
谢谢。
我正在编写一个与 MS SQL Server、MySQL 和 Oracle 对话的数据库层。我需要一个操作,如果它包含某些数据,它可以更新现有行,否则插入一个新行;一站式 SQL 操作。
本质上,如果存在,我需要保存现有数据,如果不存在,则添加它
从概念上讲,这与 upsert 相同,只是它只需要在单个表上工作。我试图确保我不需要删除然后插入,因为这会影响性能。
是否有通用 SQL 来执行此操作,还是我需要供应商特定的解决方案?
谢谢。
您需要供应商特定的 SQL,因为 MySQL(与 MS 和 Oracle 不同)不支持MERGE
http://en.wikipedia.org/wiki/Merge_(SQL )
我怀疑你迟早会需要一个供应商特定的数据库层实现——只要你做任何稍微高级的事情,SQL 可移植性几乎就是一个神话。
我很确定这将是特定于供应商的。对于 SQL Server,您可以使用MERGE语句完成此操作。
如果您使用的是 SQL Server 2008,请使用 Merge 语句。但请记住,如果您的 Insert 零件涉及某些条件,则不能使用它。在这种情况下,您需要编写自己的方式来完成此操作。在您的情况下,它必须是因为您涉及没有合并语句的 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;
}