【问题标题】:Generic SQL for update / insert用于更新/插入的通用 SQL
【发布时间】:2012-09-13 19:02:51
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

  • 从一般的角度来看,使用删除+插入方法可能会更好。假设您使用的是索引列,您应该没问题。但是,作为 podiluska cmets,一旦深入了解,纯粹的通用 SQL 就是一个神话。

标签: mysql sql sql-server database oracle


【解决方案1】:

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

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

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

【讨论】:

  • 是的,我们已经做了供应商特定的东西,但我更喜欢保持简单和通用 + 合并似乎是为在两个表而不是一个表上操作而设计的......我还没有设法让它工作但即使我这样做,感觉就像是一个黑客。
  • @user999091 - 你对 MERGE 的理解很混乱。 MERGE 在 single 表上执行 upsert。但是,它需要数据源;这通常是另一个真实的表,但它也可以很容易地成为一个虚拟表。在这一点上,您会遇到更多的供应商差异:您在 Oracle 中的处理方式与在 MSSQL 中的处理方式不同。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果您使用的是 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;
            }
    

    【讨论】:

    • 考虑到你为这个答案写了多少字,输入 youyour 而不是 uur?
    【解决方案4】:

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

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

    MySQL Reference - Insert on duplicate key update

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      相关资源
      最近更新 更多