2013-03-01 9 views
9

Mam tabelę, w której muszę przechowywać dwa identyfikatory z innej tabeli. Podczas wykonywania niektórych debugowania zauważyłem pewne dziwne zachowanie SQL.Nieoczekiwany INSERT ... USTAW zachowanie zapytania

Przykład niewłaściwym SQL:

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

Powyższy zapytanie zostało wstawienie zer jako wartość wyrażoną w dB. Zbadałem to pytanie bliżej i uświadomiłem sobie, że popełniłem błąd polegający na umieszczeniu and w miejsce ,. Prawdziwy zapytania muszę spełnić mój cel jest:

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

Który pracował, jak się spodziewałem. Moje pytanie jest związane z pierwszym (niepoprawnym) zapytaniem - ponieważ zostało wykonane i jest poprawne pod względem składni, gdzie byłyby takie zapytania, które będą używane?

Odpowiedz

11

Powodem oświadczenie INSERT nie generuje błąd składni i pracuje także dlatego MySQL niejawnie (jedna rzecz mi się nie podoba w MySQL :D) analizuje oświadczenia jako wyrażenie logiczne.

W swoim oświadczeniu INSERT tylko followerUserId kolumna jest aktualizowalny bo reszta to część logicznej wypowiedzi. Kwerenda została oceniona jako:

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

tutaj:

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

innego,

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

panu są skeet Jon sql .. niesamowite wiedza, umiejętności. –

+0

Dzięki @JW Dzisiaj uczę się również 'Insert' z' SET' i 'AND' :) –

+0

@ YogeshSuthar to stara składnia' INSERT' w mysql. –