我再问一次,因为我无法从SO上的其他问题中得到直接的答案。
我的情况如下,两张表,phones
和features
。
结构:
手机
- 编号
- 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 更好。