MySQL UPDATE vs INSERT和DELETE

问题描述:

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

基本上,已经发生的情况是,当提交表单时,所有数据都使用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); 
     } 
    } 
+1

[MySQL的LAST_INSERT_ID](http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html)会为您提供自动增量值,然后您可以在UPDATE语句。删除将无需运行自动增加值,除对参照完整性造成影响外。 – 2011-01-31 19:04:14

虽然INSERT/DELETE选项将很好地工作,我建议反对为:

  • 除非您将INSERT/DELETE 整合到一个单独的事务中,或者更好地封装了INSERT/DELETE到存储的 过程中,您将运行理论上存在重复累积的 风险。如果 您使用SP或交易你 只是有效地重写UPDATE语句 这显然是低效 ,而且会给 引起一些WTF扬眉 后来有人维护你的代码 。
  • 虽然它听起来不像 问题在您的情况下,您是 潜在影响参考 完整性,如果您需要。 此外,你失去了 相当有用的能力,以容易 检索创建顺序的记录。
  • 也许不是一个伟大的考虑上 一个小应用程序,但你 要以认真 零碎的数据库很快 这将减慢数据检索结束。
+0

这是我大学的新生入学指导的数据库,每年至少有1000个新入学条目,具体取决于入学班级的大小。我没有考虑到这种分裂,那肯定会导致问题的发生。 – awestover89 2011-01-31 19:32:40

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

在我看来,做删除是毫无意义的,如果你在MySql中运行更新,它只会更新记录,如果它不同于已存储的记录,是否有某些原因需要删除代替。我通常使用的情况下(开关)来捕捉更新/从用户删除通话,

<?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; 

} 
?>