首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时在ORM中插入或更新复合主键模型?

何时在ORM中插入或更新复合主键模型?
EN

Stack Overflow用户
提问于 2009-10-26 21:39:54
回答 3查看 1.1K关注 0票数 0

我有一个自制的ORM系统,目前只支持自动递增主键。这很好,但现在是支持复合主键的时候了。我知道代理键和复合主键之间的圣战,我个人认为每个主键都有一席之地。不管怎样..。:)

使用自动递增的主键,很容易判断在保存模型时是否必须运行INSERTUPDATE语句:这取决于是否设置了主键。

但是,对于(非自动递增的)复合主键,很难分辨,因为即使执行INSERT,也必须设置所有复合主键字段值。

因此,对于我的问题:如何确定在使用复合主键时是否应该运行INSERTUPDATE语句?

以下是我想出的解决方案:

  1. 查询预先使用复合主键是否存在记录。这似乎是最好的选择,尽管每次保存都必须运行额外的查询。
  2. 使用MySQL的INSERT ... ON DUPLICATE KEY UPDATE语法。但是,我的Model类完成的其他操作需要知道记录是否是新的,比如是验证所有列(当记录是新的)还是只验证修改过的列(当记录已经存在时)。

你有更好的解决方案吗?还是我最好的选择之一?谢谢你的洞察力!

EN

回答 3

Stack Overflow用户

发布于 2009-10-26 21:58:08

如果我能够避免使用RDBMS特定的语法,我真的不会将自己绑在一起,所以我会将第2条排除在外。

第三种选择是让用户决定和处理错误,在ORM中提供Create()和Update()方法,如果在不应该创建()的情况下使用重复的键错误,则依赖于RDBMS错误。

我个人将在ORM中提供第一种和第三种方法,这样人们就可以选择最适合的替代方案(对于非关键代码路径的易用性,或者对性能重要的地方的控制)。

票数 1
EN

Stack Overflow用户

发布于 2009-10-26 22:02:44

我相信你可以使用替换或使用

“插入.在重复键更新上”,正如您所说..。这里有一些可能有助于手册的东西。

在重复键更新时,如果将行作为新行插入,则每行受影响的行值为1,如果更新现有行,则为2。

票数 0
EN

Stack Overflow用户

发布于 2009-10-27 19:49:27

如果我必须使用您的工具,这就是我想要的行为(以及其他OR/M使用的行为):

  1. 在类中维护IsNew属性。获取数据时,将该属性设置为false。当用户创建一个新类时,将其设置为true.
  2. (当保存操作出现时),现在您知道是根据该属性执行插入还是更新。

好处:

如果用户希望在不获取数据的情况下进行更新,则可以将该属性公开,以便他们可以设置place.

  • Doesn't,如果您有单个或复合的PKs、自动增量列等,则更新将考虑place.

  • Doesn‘t问题。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1627486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档