我有一个自制的ORM系统,目前只支持自动递增主键。这很好,但现在是支持复合主键的时候了。我知道代理键和复合主键之间的圣战,我个人认为每个主键都有一席之地。不管怎样..。:)
使用自动递增的主键,很容易判断在保存模型时是否必须运行INSERT或UPDATE语句:这取决于是否设置了主键。
但是,对于(非自动递增的)复合主键,很难分辨,因为即使执行INSERT,也必须设置所有复合主键字段值。
因此,对于我的问题:如何确定在使用复合主键时是否应该运行INSERT或UPDATE语句?
以下是我想出的解决方案:
INSERT ... ON DUPLICATE KEY UPDATE语法。但是,我的Model类完成的其他操作需要知道记录是否是新的,比如是验证所有列(当记录是新的)还是只验证修改过的列(当记录已经存在时)。你有更好的解决方案吗?还是我最好的选择之一?谢谢你的洞察力!
发布于 2009-10-26 21:58:08
如果我能够避免使用RDBMS特定的语法,我真的不会将自己绑在一起,所以我会将第2条排除在外。
第三种选择是让用户决定和处理错误,在ORM中提供Create()和Update()方法,如果在不应该创建()的情况下使用重复的键错误,则依赖于RDBMS错误。
我个人将在ORM中提供第一种和第三种方法,这样人们就可以选择最适合的替代方案(对于非关键代码路径的易用性,或者对性能重要的地方的控制)。
发布于 2009-10-26 22:02:44
我相信你可以使用替换或使用
“插入.在重复键更新上”,正如您所说..。这里有一些可能有助于手册的东西。
在重复键更新时,如果将行作为新行插入,则每行受影响的行值为1,如果更新现有行,则为2。
发布于 2009-10-27 19:49:27
如果我必须使用您的工具,这就是我想要的行为(以及其他OR/M使用的行为):
好处:
如果用户希望在不获取数据的情况下进行更新,则可以将该属性公开,以便他们可以设置place.
https://stackoverflow.com/questions/1627486
复制相似问题