9

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

错误的sql示例:

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

上面的查询是在 DB 中插入零作为值。我仔细研究了查询,并意识到我犯了一个错误,and,. 我需要实现我的目的的真正查询是:

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

这正如我预期的那样工作。我的问题与第一个(不正确的)查询有关 - 因为它执行并且在语法上是正确的,所以会在哪里使用类似的查询?

4

1 回答 1

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
于 2013-03-01T10:01:01.167 回答