2013-03-01 15 views
9

Ho una tabella in cui ho bisogno di memorizzare due ID da un'altra tabella. Durante il debug ho notato alcuni strani comportamenti di SQL.Imprevisto INSERIRE ... SET comportamento query

Esempio di sql sbagliato:

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

La query sopra è stato l'inserimento delle pari a zero 'come valore nel DB. Ho studiato la query più da vicino e ho realizzato che avevo commesso un errore nel mettere and al posto di ,. La vera query che devo soddisfare il mio scopo è:

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

Che ha funzionato come mi aspettavo. La mia domanda è correlata alla prima query (errata) - dal momento che è stata eseguita ed è sintatticamente corretta, dove sarebbero utilizzate query come questa?

risposta

11

Il motivo per cui la dichiarazione INSERT non genera errore di sintassi e sta anche lavorando è perché MySQL implicitamente (una cosa che non mi piace in MySQL :D) analizza l'istruzione come espressione booleana.

Nella tua INSERT dichiarazione, solo followerUserId colonna è aggiornabile perché il resto sono parte dell'espressione booleana. La query è stata valutata come:

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

qui:

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

un'altra,

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

, signore sono il piattello jon di SQL .. stupefacente conoscenza. –

+0

Grazie a @JW Oggi imparo anche 'Inserisci' con' SET' e 'AND' :) –

+0

@YogeshSuthar è una vecchia sintassi di' INSERT' in mysql. –

Problemi correlati