为了更新MySql表,我使用了查询 -
update TABLE set status=1 and finalStatus_id=1 and id in (1,3,4);
我错误地写了和代替 where 并执行查询。
根据查询,我期待ERROR,但它成功运行。其次,我应该将所有行的状态更新为1。 但, 所有行的状态都更新为0.(为什么会这样?)
我试图找出原因和smililar使用查询,但无法找到。 为什么是这样?为什么它表现得像这样?
答案 0 :(得分:2)
您的代码被解释为:
label = driver.FindElements(By.XPath("//label[starts-with(@for, 'chk_divAccountsGrid')]"))[1].Click()
driver.executeScript("arguments[0].click()", label) // if label not work, pass-in checkbox
这是一个布尔表达式。当id为1,3或4并且update TABLE
set status = (1 and (finalStatus_id = 1) and (id in (1, 3, 4));
的值为1时,它只是“1”(true)。如果所有行都设置为finalStatus_id
,那么这永远不会成立。
您想要的查询大概是:
0
逗号用于将更新分隔为单独的列,而不是布尔值update TABLE
set status = 1,
finalStatus_id = 1
where id in (1, 3, 4);
。
答案 1 :(得分:1)
在SQL中,WHERE子句是可选的。更新表中的每一行是合法的语法,您可以通过省略WHERE子句来完成。
struct LocationService {
static func getUserLocation(completion: @escaping (CLLocation?) -> Void){
print("Atttempting to get user location")
//May need location manager function
//may need to change to always for significant location to work
Locator.requestAuthorizationIfNeeded(.whenInUse)
//It then delivers location updates to your app only when the user’s position changes by a significant amount, such as 500 meters or more.
//To subscribe to significant location changes, use the method Locator.subscribeSignificantLocations. This instructs location services to begin monitoring for significant location changes, which is very power efficient. The block will execute indefinitely (until canceled), once for every new updated location regardless of its accuracy.
// Note: If there are other simultaneously active location requests or subscriptions, the block will execute for every location update (not just for significant location changes).
Locator.subscribeSignificantLocations(onUpdate: { newLocation in
print("New location \(newLocation)")
completion(newLocation)
}) { (err, lastLocation) -> (Void) in
print("Failed with err: \(err)")
}
}
}
也许这不是一个好的语言设计,使默认是你的更新将适用于每一行,但这个标准的SQL语法,无论好坏。
MySQL客户端有一个标志UPDATE table SET status=1;
,可以防止您意外执行此类查询。如果查询是UPDATE或DELETE并且没有WHERE子句,它会将查询视为错误。这仅适用于MySQL客户端,而不适用于任何编程接口。因此,如果您在应用程序代码中犯了同样的错误,它就不起作用。
下一部分是您将--safe-updates
设置为表达式。表达式可以是一个简单的值,如status
,但它也可以是一个更复杂的表达式。
这是一个法律表达:
1
由于1 and finalStatus_id=1 and id in (1,3,4)
与1
相同,因此它是true
的合法操作数。另外两个术语也是布尔条件。
整个表达式的结果是布尔and
或true
,在MySQL中相当于false
或1
。
因此,您将此表达式应用于表中的每一行。当然,0
不在(1,3,4)的每一行都会false
。