0

Ya lo he intentado con UNIQUE y CHECK pero no me funciona.

Si hay un profesor con una asignatura quería que no me metiese otra vez la misma asignatura, ya que por el resto del código que tengo hace que se repita.

* * *

for($i=0;$i<count($profesores);$i++){
if($profesores[$i]!="")
{
$Query=$link->prepare ("insert into joom37_docencia_prof_asig (asignatura,profesor)  VALUES ('".$asignatura."','".$profesores[$i]."')");
$Query->execute();

}

* *

  • *Ya lo he intentado con UNIQUE y CHECK pero no me funciona.*: Muéstranos lo que intentastes exactamente. Tal vez no lo hicistes correctamente. – sstan Nov 22 '17 at 17:05
  • Advertencia aparte, pero importante: [¿Qué es la inyección SQL y cómo puedo evitarla?](https://es.stackoverflow.com/questions/10518/qu%C3%A9-es-la-inyecci%C3%B3n-sql-y-c%C3%B3mo-puedo-evitarla) – sstan Nov 22 '17 at 17:06
  • Creo que la mejor solución a tu problema, viendo que estás insertando dentro de un bucle sería incorporar una función que verifique si la tupla `asignatura, profesor` existe... cuando no exista, cada llamada a esa función te iría creando una consulta dinámica de inserción con cada registro nuevo y al final ejecutas **una sola vez** esa consulta dinámica. El hecho de usar PDO, añadiendo el uso de consultas preparadas, te facilitará ese trabajo, ya que prepararías la consulta y la ejecutarías una sola vez. – A. Cedano Nov 22 '17 at 18:19
  • Muchas gracias! – Nicolas Cortizo Nov 23 '17 at 10:58

1 Answers1

0

Yo empezaría por crear una llave UNIQUE en (asignatura, profesor).

Hecho esto, puedes usar INSERT IGNORE:

INSERT IGNORE INTO joom37_docencia_prof_asig (asignatura,profesor)
VALUES ('asignatura1','profesor1')

Eso simplemente se salta la insersión si el nuevo registro colisiona con una tupla única. También, ya que hablamos de MySQL puedes usar el método de conveniencia REPLACE en vez de INSERT.

REPLACE INTO joom37_docencia_prof_asig (asignatura,profesor)  
VALUES ('asignatura1','profesor1')

Pero esto implica que si la llave existe, va a borrar la fila existente y añadir otra. En caso de haber un campo ID autoincremental, va a cambiar el ID porque será una nueva fila.

Finalmente, según tu caso de uso, también podrías usar INSERT ... ON DUPLICATE, por ejemplo si quieres que efectivamente no se modifique la fila que contiene la tupla única, pero sí se actualice un campo de que refleje la última actualización:

INSERT INTO joom37_docencia_prof_asig (asignatura,profesor)  
VALUES ('asignatura1','profesor1')
ON DUPLICATE KEY UPDATE actualizacion = now();

En resumen, esta es una parte de la lógica que yo preferiría manejar con las herramientas nativas de la BBDD para resguardar la integridad de los datos.

ffflabs
  • 21,223
  • 25
  • 48