繁体   English   中英

何时使用ORM中的复合主键模型进行INSERT或UPDATE?

[英]When to INSERT or UPDATE with composite primary key models in ORM?

我有一个自制的ORM系统,该系统目前仅支持自动递增的主键。 这种方法效果很好,但是现在是支持复合主键的时候了。 我知道代理主键和复合主键之间的神圣之战,我个人认为每个主键之间都有地方。 无论如何... :)

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

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

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

这是我想出的解决方案:

  1. 事先使用复合主键查询记录是否存在。 这似乎是最好的选择,即使每次保存都必须运行一个附加查询。
  2. 使用MySQL的INSERT ... ON DUPLICATE KEY UPDATE语法。 但是,我的Model类完成的其他操作需要知道记录是否为新记录,例如是验证所有列(当记录为新记录时)还是仅对修改后的列(当记录已存在时)进行验证。

您有更好的解决方案吗? 还是我最好的选择之一? 感谢您的见解!

如果可以避免的话,我真的不会将自己束缚于RDBMS特定的语法,因此我将2号规则排除在外。

第三种选择是让用户决定和处理错误,在您的ORM中同时提供Create()和Update()方法,如果您不应该使用Create(),则依靠RDBMS进行重复键错误,从而出错。

我个人将在ORM中同时提供第一种和第三种方法,因此人们可以选择最适合的替代方法(对于非关键代码路径易于使用,或对性能至关重要的地方进行控制)。

我相信您可以使用REPLACE或使用

如您所说,“ INSERT ... ON DUPLICATE KEY UPDATE” ..这可能对手册有所帮助。

使用ON DUPLICATE KEY UPDATE,如果将行作为新行插入,则每行的受影响行值为1;如果更新现有行,则为2。

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

  1. 在您的课程上维护一个IsNew属性。 当您获取数据时,将该属性设置为false。 用户创建新类时,请将其设置为true。

  2. 当保存操作到来时,现在您知道是基于该属性( IsNew )执行INSERT还是UPDATE。

好处:

  • 没有其他查询。
  • 如果用户要进行更新而不先获取数据,则可以将该属性设为公开,以便他们可以设置IsNew = false ,然后进行更新。
  • 有单个或复合PK,自动增量列等都没关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM