先更新或删除,然后插入


UPDATE or DELETE first then INSERT

我再问一次,因为我无法从SO上的其他问题中得到直接的答案。

我的情况如下,两张表,phonesfeatures

结构:

手机

  • 编号
  • brand_id
  • 图片
  • 发表

特征

  • 编号
  • phone_id
  • 特征

现在,features包含大量值,这些值仅在1和4之间通过phone_id对应于某个手机。

现在,当我更新功能

时,您认为删除然后再次插入新功能或更新现有功能是最好的吗?

//编辑:

特价

  • 编号*
  • phone_id
  • contract_id
  • start_publish
  • finish_publish
  • 发表

合同

  • 编号*
  • 名字
  • 效益
  • 期间
  • 价格等

品牌

  • 编号
  • 名字
  • 商标

所以基本上,一个特殊的链接一个电话和一个合同,并从两个表中获取信息进行输出。然后在此过程中,使用功能单独加载每部手机的功能。

编辑 2:

哦,一次只会删除

/更新一部手机的功能,而且一次只会删除 1-4 个功能。此外,功能总是可以或多或少,并且永远不会有固定的数量。

当您"更新功能"时,您就是这样做的,update .

应该使用 UPDATE。或者,可以在一个 REPLACE 命令中完成删除和插入。

http://dev.mysql.com/doc/refman/5.0/en/replace.html

此外,如果可以共享功能(多对多关系),则可能需要考虑仅将电话 ID 链接到功能 ID 的第三个表。

如果每部手机的功能数量发生变化,则必须删除并插入。要进行更新,您需要:

  • 获取当前功能集
  • 找出有什么不同,添加了什么,删除了什么
  • 运行查询以更新、插入新数据和删除旧数据。

就好像您只是删除整个列表并重新插入它们一样,您可以省去一些维护麻烦。

如果数据的一致性是一个问题或问题(数据被删除,但在插入之前发生错误导致脚本无法完成),请将查询包装在事务中。

举个例子:

我有一个博客,有Posts(id, title, body)Categories(id, post_id, category).我的第一篇文章"Hello World"被归类为"meta,php和javascript"。一年后,我修改了这篇文章,以获得一些关于mysql的信息(或者我添加一个mysql类别)并删除javascript。

这是我需要做的(主要是伪代码):

//old set
SELECT * FROM Categories WHERE post_id=1
foreach($categories as $category) {
    if(in_array($category['id'], $_POST['categories']) {
        //this category is in the new set and the old set, do nothing
    }
    elseif(!in_array($category['id'], $_POST['categories']) {
        //this category is in the old set, but not the new one, delete it
        $queries[] = "DELETE FROM Categories WHERE id=".$category['id'];
    }
    else {
        //new category, add it
        $queries[] = "INSERT INTO Categories()..."
    }
}
foreach($queries as $item) {
    //run query
}

与此相比:

DELETE FROM Categories WHERE post_id=$_POST['id']
foreach($_POST['categories'] as $item) {
    INSERT INTO Categories() ...
}

就个人而言,我认为选项 #2 更好。