2013-03-01 93 views
9

我有一张表,我需要从另一个表中存储两个ID。在做一些调试时,我注意到了一些奇怪的SQL行为。错SQL的意外的INSERT ... SET查询行为

实施例:

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

上述查询被插入零的像在DB值。我仔细研究了查询,并意识到我错误地将and代替为,。我需要实现我的目的的真正查询是:

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

其中的工作如我所料。我的问题与第一个(不正确的)查询有关 - 因为它执行并且在语法上是正确的,那么查询会在哪里使用?

回答

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 
+1

你先生是SQL的乔恩斯基特..惊人知识。 – 2013-03-01 10:02:25

+0

谢谢@JW今天我也学习用'SET'和'AND'插入':) – 2013-03-01 10:03:01

+0

@YogeshSuthar它是mysql中'INSERT'的一个旧语法。 – 2013-03-01 10:03:42