我有一个自制的ORM系统,目前只支持自动递增主键。这一点运作良好,但现在是支持复合主键的时候了。我知道代理与复合主键之间的神圣战争,我个人认为每个都有一个地方。无论如何...... :)
使用自动递增的主键,可以很容易地判断保存模型时是否必须运行INSERT
或UPDATE
语句:它取决于是否设置了主键
但是使用(非自动递增)复合主键,这并不容易分辨,因为即使您正在执行INSERT
,也必须设置所有复合主键字段值。
因此,我的问题是:在使用复合主键时,如何确定是否应运行INSERT
或UPDATE
语句?
以下是我提出的解决方案:
INSERT ... ON DUPLICATE KEY UPDATE
语法。但是我的Model类完成的其他操作需要知道记录是否是新的,比如是否验证所有列(当记录是新的时)或只是修改的列(当记录已存在时)。你有更好的解决方案吗?或者这是我最好的选择之一?感谢您的见解!
答案 0 :(得分:1)
如果我可以避免它,我真的不会把自己绑定到RDBMS特定语法,所以我将第2号规则排除在外。
第三个选项是让用户决定并处理错误,在ORM中提供Create()和Update()方法,指望RDBMS错误输出时出现重复键错误如果你不应该创建()没有。
我个人会在ORM中提供第一种和第三种方法,因此人们可以选择最合适的替代方案(非关键代码路径的易用性,或者对性能重要的地方进行控制)。
答案 1 :(得分:0)
我相信您可以使用REPLACE或使用
“INSERT ... ON DUPLICATE KEY UPDATE”正如你所说的......这里有一些可能对手册有所帮助。
使用ON DUPLICATE KEY UPDATE, 每行的受影响行值为1 该行作为新行和2插入 如果现有行已更新。
答案 2 :(得分:0)
如果我必须使用您的工具,这是我想要的行为(以及其他OR / M使用的行为):
在您的课程中维护 IsNew 属性。获取数据时,将该属性设置为false。当用户创建新类时,将其设置为true。
当保存操作到来时,现在您知道是基于该属性执行INSERT还是UPDATE( IsNew )。
优点: