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 originalmysql> #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.