MySQL 更新与插入和删除

awe*_*r89 6 mysql sql-update

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

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

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

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

由于删除只会在插入成功时发生,我不会冒不插入就删除数据的风险,从而丢失数据,但由于插入/删除是两个查询,它会比仅使用 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

Cru*_*han 5

虽然 INSERT/DELETE 选项可以很好地工作,但我建议反对它:

  • 除非您将 INSERT/DELETE 捆绑到单个事务中,或者更好地将 INSERT/DELETE 封装到存储过程中,否则您确实会面临累积重复项的理论风险。如果您使用 SP 或事务,您只是有效地重写了 UPDATE 语句,这显然是低效的,而且以后维护您的代码的任何人都会引起一些 WTF 的注意。
  • 尽管在您的情况下这听起来不是问题,但如果您需要,您可能会影响参照完整性。此外,您正在失去按创建顺序轻松检索记录的相当有用的功能。
  • 对于小型应用程序可能不是一个很好的考虑因素,但是您最终会很快得到一个严重碎片化的数据库,这会减慢数据检索速度。