Node.js 如何知道查询失败的原因
让我们假设一个多租户应用程序具有以下表格:Node.js 如何知道查询失败的原因,node.js,mysql,database,api,Node.js,Mysql,Database,Api,让我们假设一个多租户应用程序具有以下表格: person (tenant_id, id, status, name, company_id) company (tenant_id, id, name) 更新人员条目时,应用以下约束: 公司id必须存在且租户id必须匹配 状态必须有效 我目前使用的是一个考虑了所有约束的查询: 更新人 设置person.company\u id=100 其中person.tenant_id='A' 和person.id=1 和person.status=10 并且
person (tenant_id, id, status, name, company_id)
company (tenant_id, id, name)
更新人员条目时,应用以下约束:
公司id必须存在且租户id必须匹配
状态必须有效
我目前使用的是一个考虑了所有约束的查询:
更新人
设置person.company\u id=100
其中person.tenant_id='A'
和person.id=1
和person.status=10
并且存在从company.tenant_id='A'和company.id=100的公司中选择TRUE
查询的输出指示更新了多少行
在没有更新行的情况下,我想知道根本原因。是否因为:
在我的情况下,作为主键的id不存在。
id确实存在,但状态不正确。
公司id不存在。
这将允许我返回适当的错误消息
你认为最好是:
事先分别询问
选择除主键外没有任何约束的条目。
从租户id=A且id=1的人员中选择id、状态和姓名
如果没有找到条目,我可以立即返回404
如果找到条目,我可以检查状态是否有效。如果无效,我可以返回一条错误消息
确保公司对象存在
选择id,公司名称,其中租户id='A'和id=100
如果它不存在,我可以返回一条错误消息
如果有,我可以尝试进行更新
使现代化
运行包含所有约束的初始查询,因为自步骤1以来数据可能已更改
赞成者:没有
缺点:多个DB调用,进程较慢,进程中可能会更改数据
首先运行整个查询,然后尝试查找原因
在这里,考虑到数据在大多数情况下都是有效的,我尽量保持乐观并立即运行初始查询
仅当数据无效时,我进行与上述相同的附加查询以了解根本原因
在我运行初始查询和最后一次查询之间,数据可能仍然会更改
优点:数据有效时速度更快
缺点:如果出现错误,需要多次DB调用,在此过程中可以更改数据
使用存储过程
这将解决数据更改问题,但我希望避免使用存储过程
优点:打一个DB电话
缺点:数据库工作负载
具体来说,我正在使用和运行此应用程序。尝试使用
UPDATE person
SET person.company_id = 100
WHERE person.tenant_id = 'A'
AND person.id = 1
AND person.status = 10
AND EXISTS (SELECT id FROM company WHERE company.tenant_id='A' and company.id=100)
尝试使用
UPDATE person
SET person.company_id = 100
WHERE person.tenant_id = 'A'
AND person.id = 1
AND person.status = 10
AND EXISTS (SELECT id FROM company WHERE company.tenant_id='A' and company.id=100)
从性能的角度来看,最有可能的做法是先运行整个查询,然后再尝试查找原因,这是您的最佳选择,而“事后”意味着只有在没有更新任何行的情况下才这样做
这是基于这样一个假设,即此类故障相对较少,而该假设本身是基于这样一个假设,即用于识别待更新行的选择标准将相对最近建立。如果是5天前的一批数据,情况可能会略有不同
我可能还想补充一点,从功能的角度来看,尝试将错误消息获取到您想要达到的精度水平是比较少见的,原因是,要想正确操作,结果总是比您可能想象的要复杂得多。从性能的角度来看,最有可能的做法是先运行整个查询,然后再尝试查找原因,这是您最好的选择,之后意味着只有在没有行被更新的情况下
这是基于这样一个假设,即此类故障相对较少,而该假设本身是基于这样一个假设,即用于识别待更新行的选择标准将相对最近建立。如果是5天前的一批数据,情况可能会略有不同
我可能还想补充一点,从功能的角度来看,尝试将错误消息获取到您想要达到的精度水平是相对少见的,原因是,要获得正确的消息总是比您可能想象的要复杂得多。尽管您对SQL语法的理解是正确的,它没有回答这个问题。我想知道如何处理具有多个约束的查询,并找到一种方法来知道哪些约束导致查询失败。您的问题不够清楚,因为它无法说明什么是“不成功”。找不到要更新的行可能会被您视为未成功,但从技术上讲,SQL将成功完成其工作,并且仅为此发出警告。您的问题不够清楚的第二个原因是您没有详细说明您认为合适的错误消息类型。谢谢您的反馈。我已经更新了我最初的帖子,希望它现在更有意义。虽然你对SQL语法的理解是正确的,但它并没有回答这个问题。我想知道
w如何处理有多个约束条件的查询,并找到一种方法来知道哪一个约束条件导致查询失败。你的问题不够清楚,因为它不能说明你所说的“不成功”是什么意思。找不到要更新的行可能会被您视为未成功,但从技术上讲,SQL将成功完成其工作,并且仅为此发出警告。您的问题不够清楚的第二个原因是您没有详细说明您认为合适的错误消息类型。谢谢您的反馈。我已经更新了我最初的帖子,希望它现在更有意义。