首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于更新/插入的通用SQL

问用于更新/插入的通用SQL
EN

Stack Overflow用户
提问于 2012-09-21 18:53:25
回答 4查看 1K关注 0票数 2

我正在写一个DB层,它可以与MS SQL Server,MySQL和甲骨文对话。我需要一个操作,可以更新现有的行,如果它包含某些数据,否则插入一个新行;所有在一个SQL操作。

从本质上讲,我需要保存现有的数据,如果它存在,或者添加它,如果它不存在

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

有没有通用的SQL来做这件事,或者我需要特定于供应商的解决方案?

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2012-09-21 18:54:56

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

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

我怀疑,您很快就会需要一个特定于供应商的DB层实现- SQL可移植性几乎是一个神话,只要您做了任何事情,即使是稍微先进的。

票数 3
EN

Stack Overflow用户

发布于 2012-09-21 18:55:11

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

票数 1
EN

Stack Overflow用户

发布于 2012-09-21 18:58:12

如果您使用的是SQL Server2008,请使用Merge语句。但请记住,如果您的插入部分包含某些条件,则不能使用它。在这种情况下,您需要编写自己的方式来完成此任务。在您的例子中,它必须是这样的,因为您涉及的是没有Merge语句的MySQL。

为什么不使用ORM层(比如实体框架)来实现这个目的呢?

只有一些伪代码(在C#中)

代码语言:javascript
复制
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;
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12529130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档