用于更新/插入的通用SQL

时间:2012-09-21 10:53:25

标签: mysql sql sql-server database oracle

我正在编写一个与MS SQL Server,MySQL& amp;甲骨文。我需要一个操作,如果它包含某些数据,可以更新现有的行,否则插入一个新行;一体化SQL操作。

基本上我需要保存现有数据(如果存在),或者如果不存在则添加

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

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

感谢。

4 个答案:

答案 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)

在MySQL中你有类似于merge的东西:

在重复密钥更新中插入... ...

MySQL Reference - Insert on duplicate key update