Hola andrewp:
 
El problema puede estar por la manera en que estás definiendo tu tabla, pues no nos dices nada a ese respecto, una correcta definición de llaves e índices es promordial para el buen funcionamiento de la cláusula ON DUPLICATE KEY.  
Observa este ejemplo, la tabla tiene un campo llave autoincremental (ID) y un campo único (escuela), hay que recordar que son dos cosas muy distintas campos PRIMARY  KEY y UNIQUE. La definición de la tabla quedaría así:    
Código MySQL:
Ver original-     -> ); 
- Query OK, 0 rows affected (0.31 sec) 
-   
- mysql> #insertamos tres registros distintos 
-     -> (NULL, 'alfa', 10.00, 'A'), 
-     -> (NULL, 'beta', 30.00, 'F'), 
-     -> (NULL, 'gama', 90.00, 'T'); 
- Query OK, 3 rows affected (0.04 sec) 
-   
- +----+---------+-------+------+ 
- | id | escuela | valor | prof | 
- +----+---------+-------+------+ 
- |  1 | alfa    | 10.00 | A    | 
- |  2 | beta    | 30.00 | F    | 
- |  3 | gama    | 90.00 | T    | 
- +----+---------+-------+------+ 
Ahora bien, veamos con este script si se entiende cómo funciona la cláusula ON DUPLICATED KEY;    
Código MySQL:
Ver original- mysql> #insertamos tres registros: 
- mysql> #'delta' es un registro nuevo, se INSERTA, 
- mysql> #'alfa' es un registro duplicado por UNIQUE, se ACTUALIZA 
- mysql> #'otra beta' es un registro duplicado por PRIMARY KEY, se ACTUALIZA 
-     -> (NULL, 'delta', 70.00, 'A'), 
-     -> (NULL, 'alfa', 70.00, 'A'), 
-     -> (2, 'otra beta', 70.00, 'A') 
- Query OK, 5 rows affected (0.03 sec) 
-   
- +----+---------+--------+------+ 
- | id | escuela | valor  | prof | 
- +----+---------+--------+------+ 
- |  1 | alfa    | 999.00 | Z    | 
- |  2 | beta    | 999.00 | Z    | 
- |  3 | gama    |  90.00 | T    | 
- |  4 | delta   |  70.00 | A    | 
- +----+---------+--------+------+ 
Observa que el registro 4 se insertó, mientras que los registros 1 y 2 se actualizaron. 
Dale un vistazo a ver si queda claro, si tienes problemas postea el script de creación de tu tabla para tratar de ayudarte. 
Saludos
Leo.