意外的INSERT ... SET查询行为

ash*_*nix 9 php mysql sql sql-insert

我有一个表,我需要从另一个表存储两个id.在做一些调试时我发现了一些奇怪的SQL行为.

错误的sql示例:

INSERT INTO follower_list set `followerUserId` = '3' AND `followingUserid` = '4' 
Run Code Online (Sandbox Code Playgroud)

上面的查询是在数据库中插入零作为值.我仔细研究了这个问题,发现我犯了一个and代替的错误,.我需要实现的目的是:

INSERT INTO table SET col1 = '3' , col2 = '4'
Run Code Online (Sandbox Code Playgroud)

这符合我的预期.我的问题与第一个(不正确的)查询有关 - 因为它执行并且在语法上是正确的,在哪里使用它的查询?

Joh*_*Woo 11

INSERT语句之所以没有生成语法错误并且它也有效的原因是因为MySQL隐式(我在MySQL中不喜欢的一件事:D)将语句解析为布尔表达式.

在您的INSERT语句中,只有followerUserId列是可更新的,因为其余的是布尔表达式的一部分.该查询被评估为:

INSERT INTO follower_list SET followerUserId = ('3' and (followingUserid='4')) 
Run Code Online (Sandbox Code Playgroud)

这里:

followerUserId = ('3' and (followingUserid='4')) // assuming followingUserid <> 4
followerUserId = ('3' and (0))
followerUserId = 0
Run Code Online (Sandbox Code Playgroud)

另一个,

followerUserId = ('3' and (followingUserid='4')) // assuming followingUserid = 4
followerUserId = ('3' and (1))
followerUserId = 1      // will only return zero if one of the values is zero
Run Code Online (Sandbox Code Playgroud)