【发布时间】:2019-03-09 06:39:01
【问题描述】:
我正在使用 sequelize 连接到 SQL Server。这是对 upsert 的基本调用:
RolesPerms.upsert({
// values
role_id: rolePerm.role_id,
permission_name: rolePerm.permission_name
}, {
// options
where: {
role_id: rolePerm.role_id,
permission_name: rolePerm.permission_name
},
returning: true
}).then(result => {
console.log('dv', result[0].dataValues);
returnArr.push(result[0].dataValues);
return result[0].dataValues;
})
查看日志,我看到初始查询是这样的:
执行(默认):MERGE INTO [roles_perms] WITH(HOLDLOCK) AS [roles_perms_target] 使用(值(1,N'Role 删除','2018-10-03 23:28:58.868 +00:00', '2018-10-03 23:28:58.868 +00:00')) AS [roles_perms_source]([role_id], [permission_name], [createdAt], [updatedAt]) ON [roles_perms_target].[role_id] = [roles_perms_source].[role_id] AND [roles_perms_target].[permission_name] = [roles_perms_source].[permission_name] 匹配时然后更新集 [roles_perms_target].[role_id] = 1, [roles_perms_target].[permission_name] = N'角色删除', [roles_perms_target].[updatedAt] = '2018-10-03 23:28:58.868 +00:00' 不匹配时插入([role_id],[perm ission_name], [createdAt], [updatedAt]) VALUES(1, N'Role delete', '2018-10-03 23:28:58.868 +00:00', '2018-10-03 23:28:58.868 +00:00') 输出 $action, INSERTED.*;
这之后是这条日志消息:
正在执行(默认):SELECT [role_id]、[permission_name]、[createdAt]、 [updatedAt] FROM [roles_perms] AS [roles_perms] WHERE [roles_perms].[role_id] = 1;
注意 SELECT 语句如何不使用 upsert 中定义的 WHERE。因为 upsert 中的两个字段是主键的定义,所以这会导致一个 select 语句,它总是只抓取第一个项目以匹配 role_id,而不是刚刚更新的实际项目。换句话说,大多数时候结果是错误的。幸运的是,初始查询确实可以正常工作,因此 DB 没问题。但我确实想向调用应用程序报告正确的结果!
这是一个错误还是我错过了文档中的某些内容?
【问题讨论】: