2

我正在编写一个与 MS SQL Server、MySQL 和 Oracle 对话的数据库层。我需要一个操作,如果它包含某些数据,它可以更新现有行,否则插入一个新行;一站式 SQL 操作。

本质上,如果存在,我需要保存现有数据,如果不存在,则添加它

从概念上讲,这与 upsert 相同,只是它只需要在单个表上工作。我试图确保我不需要删除然后插入,因为这会影响性能。

是否有通用 SQL 来执行此操作,还是我需要供应商特定的解决方案?

谢谢。

4

4 回答 4

3

您需要供应商特定的 SQL,因为 MySQL(与 MS 和 Oracle 不同)不支持MERGE

http://en.wikipedia.org/wiki/Merge_(SQL )

我怀疑你迟早会需要一个供应商特定的数据库层实现——只要你做任何稍微高级的事情,SQL 可移植性几乎就是一个神话。

于 2012-09-21T10:54:56.383 回答
1

我很确定这将是特定于供应商的。对于 SQL Server,您可以使用MERGE语句完成此操作。

于 2012-09-21T10:55:11.067 回答
1

如果您使用的是 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;
        }
于 2012-09-21T10:58:11.503 回答
0

在 MySQL 中,你有一些类似于合并的东西:

在重复键更新时插入 ...

MySQL 参考 - 在重复键更新时插入

于 2012-09-26T21:34:15.500 回答