【问题标题】:MySQL UPDATE vs INSERT and DELETEMySQL 更新与插入和删除
【发布时间】:2011-01-31 18:58:55
【问题描述】:

我正在开发一个 Web 应用程序项目,并且有一个相当大的 html 表单需要将其数据存储在一个表中。表单和插入已经完成,但我的客户希望能够将保存的数据加载回 HTML 表单并能够更改它,再次,这没问题,但是我在进行更新时遇到了一个问题,如果是编辑,只保留插入查询然后删除旧行是否合适?

基本上,已经发生的事情是,当提交表单时,使用 INSERT 将所有数据放入表中,如果数据用于正在更新的现有字段,我还有一个名为 edit 的标志,其中包含主键 ID。我可以通过两种方式处理更新功能:

a) 创建一个包含所有字段/数据集的实际更新查询,并使用 if/else 来决定是运行更新还是插入查询。

b) 每次都进行插入,但插入成功后在 DELETE WHERE row=editID 中添加一行。

由于只有在 INSERT 成功的情况下才会删除,所以我不会冒在不插入的情况下删除数据的风险,从而丢失数据,但是由于 INSERT/DELETE 是两个查询,它是否会比仅使用效率低一个 if/else 来决定是运行插入还是更新?

还有第二个表使用自增id作为外键,但是每次提交表单时都要更新这个表,所以如果我删除表A中的行,我也会删除表 b 中的关联行。这似乎是不好的编程习惯,所以无论如何我都倾向于选项 a),但仅使用单行选项非常诱人。 DELETE 基本上如下。这实际上是不好的编程习惯吗?除了约定之外,还有什么理由可以说明这是“永远不要那样做!”代码类型?

    if ($insertFormResults) {
        $formId = mysql_insert_id();
        echo "Your form was saved successfully.";
        if(isset($_POST['edit'])){
            $query = "DELETE FROM registerForm WHERE id='$_POST[edit]'";
            $result = mysql_query($query);
        }
    }

【问题讨论】:

  • MySQL's LAST_INSERT_ID 将为您提供自动增量值,然后您可以在 UPDATE 语句中使用该值。除了影响参照完整性之外,删除还会不必要地增加自动增量值。

标签: mysql sql-update


【解决方案1】:

虽然 INSERT/DELETE 选项可以很好地工作,但我建议不要这样做:

  • 除非您捆绑了 INSERT/DELETE 最多一次交易,或 更好的是封装 插入/删除到存储的 你运行理论的程序 累积重复的风险。如果 您使用 SP 或您的交易 只是有效地重写 UPDATE 显然是声明 效率低下,而且会给 上升到几个 WTF 挑眉 稍后由维护您的任何人 代码。
  • 虽然听起来不像 在你的情况下你是问题 潜在影响参考 如果你需要的话,完整性。 此外,您正在失去 相当有用的能力很容易 按创建顺序检索记录。
  • 可能不是一个很好的考虑因素 一个小应用程序,但你是 最终会认真 碎片化数据库相当快 这会减慢数据检索速度。

【讨论】:

  • 这是我所在大学的新生指导数据库,因此每年至少有 1000 个新条目,具体取决于新生班级规模。我没有考虑碎片化,这肯定会导致问题。
  • @awestover89 - 那么正确地做事是有意义的。就我个人而言,我通常会受到第一个的激励 - 给任何在我之后的人一个 WTF 时刻。您的声誉很重要,尽管无论您如何编写代码,他们都会是后来出现并批评您的人(可能是因为他们自己做奇怪的事情),但最好不要通过使用不寻常的结构来为他们提供借口来进行标准操作。
  • 我同意克鲁坎的观点。 UPDATE本质上“插入一个新的并删除旧的”,除了1)它是一个原子操作,2)它保持相同的ID 3)它是MySQL本机理解这一点的方式和4)其他人都是这样做的。 3和4都很重要。 MySQL 将被优化为以标准方式做事。并且绝对下一个程序员会更快地理解“更新”。当你有明确的理由并且可以在 cmets 中解释时,尝试只以非标准的方式做事。
【解决方案2】:

更新只是到服务器的一次往返,效率更高。除非您有涉及可能出现错误数据的原因,否则请始终默认使用 UPDATE。

【讨论】:

    【解决方案3】:

    在我看来,删除是没有意义的,如果你在 MySql 中运行更新,它只会更新记录,如果它与已经存储的不同,有什么原因你需要删除.我通常使用 case(switch) 来捕获用户的更新/删除调用,

    <?php
    switch (action) {
    
    case "delete" :
    block of coding;
    if the condition equals value1;
    break;
    
    case "edit" :
    block of coding;
    if the condition equals value2;
    break;
    
    }
    ?> 
    

    【讨论】:

      猜你喜欢
      • 2014-08-27
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2011-07-24
      相关资源
      最近更新 更多