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

时间:2013-03-01 09:58:49

标签: php mysql sql sql-insert

我有一个表,我需要从另一个表中存储两个id。在进行一些调试时,我注意到了SQL的一些奇怪行为。

错误的sql示例:

INSERT INTO follower_list set `followerUserId` = '3' AND `followingUserid` = '4' 

上面的查询是在数据库中插入零值作为值。我仔细研究了查询,发现我错误地将and放在了,的位置。我需要实现的目的是:

INSERT INTO table SET col1 = '3' , col2 = '4'

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

1 个答案:

答案 0 :(得分:11)

INSERT语句不会生成语法错误并且它也有效的原因是因为MySQL隐式(我不喜欢MySQL :D )将语句解析为布尔表达式。

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

INSERT INTO follower_list SET followerUserId = ('3' and (followingUserid='4')) 

这里:

followerUserId = ('3' and (followingUserid='4')) // assuming followingUserid <> 4
followerUserId = ('3' and (0))
followerUserId = 0

另一个,

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