2

我再次问这个问题,因为我无法从关于 SO 的其他问题中得到直接的答案。

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

结构:

电话

  • ID
  • 品牌标识
  • 模型
  • 图片
  • 发表

特征

  • ID
  • 电话号码
  • 特征

现在,features包含很多值,只有 1 和 4 之间的值对应于某个电话 via phone_id

现在,当我更新功能时,您认为删除然后再次插入新功能还是更新现有功能最好?

// 编辑:

特价商品

  • ID*
  • 电话号码
  • 合同编号
  • 开始发布
  • 完成_发布
  • 发表

合同

  • ID*
  • 姓名
  • 益处
  • 期间
  • 价格等

品牌

  • ID
  • 姓名
  • 标识

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

// 编辑 2:

哦,一次只能删除/更新一部手机的功能,而且一次只能删除 1-4 个功能。此外,特征总是可以或多或少,而不是一个固定的数字。

4

3 回答 3

2

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

于 2012-04-24T23:04:46.303 回答
1

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

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

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

于 2012-04-24T23:08:39.580 回答
0

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

  • 获取当前的特征集
  • 弄清楚有什么不同,添加了什么,删除了什么
  • 运行查询以更新、插入新数据和删除旧数据。

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

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

举个例子:

我有一个博客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更好。

于 2012-04-24T23:09:36.277 回答