0

假设我们有这些 SQL 表:

[Articles] 
bill   int         (pkey)
arti   int         (pkey)
name   varchar(50) 

[Bills]
bill   int         (pkey)
fdate  date
uid    int

假设我们在网格上有一个项目列表,代表一个账单:

--------------------------------------------------------------
Id[      15]  Date [01-01-1980]
User [pepe]

Code   Name
----------------------------
1      Something
2      Article name
3      lolololololoolo
4      datadatdatdatdata
5      datadatdatdatdata
--------------------------------------------------------------

因此,我们有一个带有 id、用户、日期等的标题。然后,网格中填充了项目。

当用户决定时,两个表将同时保存(保存按钮)。并且,用户还可以查看以前的账单并对其进行修改。那么,有什么更好的呢?

  1. 循环这些项目并进行查询以确定:如果存在是 INSERT,否则是 UPDATE。
  2. 删除所有项目(按账单 ID),然后执行所有 INSERTS。
4

3 回答 3

3

两者都不

  • 将网格数据提取到 XML,或创建/加载 2 个临时表
  • 将 SQL 中的 XML 解析为临时表,或读取 2 个临时表...
  • 更新或插入(根据需要合并、重复等)

在事务中包装对两个表的写入

于 2010-06-22T16:35:31.247 回答
2

如果您只有这两个选择,则主要取决于您的要求和要优化的用例。也就是说,您应该考虑以下事项

表现

在选项 1 中删除所有文章将需要更长的时间。

在选项 2 中,在有 10 篇文章的账单中添加无文章与在没有文章的账单中添加 10 篇文章所花费的时间大致相同。

审计

选项 2 很难审核

并发 假设应用程序中没有并发检测

两个用户同时打开账单。每个用户添加添加五篇文章并点击保存。

在选项 1 中,您最终将获得 10 篇文章。在选项 2 中,您最终会得到五个。

我不能说哪个是对的。

交易表现

将文章添加到现有账单时,事务将花费比选项 2 所需的时间更长的时间。这增加了该用例出现死锁的可能性。

在没有事务支持的情况下保存失败这假设您的应用程序不使用事务。

在选项 1 中,新文章可能会丢失,而应删除的已删除文章可能不会

在选项 2 中,所有文章都有可能丢失

于 2010-06-22T17:19:47.547 回答
1

为什么不在 DUPLICATE KEY 上使用 MySQL 语法?

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

 INSERT INTO table (a,b,c) VALUES
 (1,2,3)   ON DUPLICATE KEY UPDATE
 c=c+1;
于 2010-06-22T16:34:29.963 回答