1

Estoy buscando la manera de efectuar un INSERT INTO en una tabla de MySQL pero con la peculiaridad de que no se deje insertar los datos si ya existen.

Creo que no podría hacer un if por que la tabla está compuesta en gran parte de fk aunque tengo 2 campos que son para fechas (Fecha en la que se inserta el dato, y fecha en la que se efectúa la acción).

¿Alguna idea? ¿Añado otro campo a la tabla para poder hacer la comparativa?

La tabla a la que quiero insertar los datos se llama enfrentamientos y tiene la siguiente estructura:

id_en (AI PK) 
tipo_liga 
id_div (FK)  
id_jor
expected_date
id_eq_l (FK)
id_eq_v (FK)
fecha_dato (TIMESTAMP)

Sé cómo insertar los datos en esta tabla, pero lo que necesito es que si se vuelve a intentar meter unos datos iguales a los que ya están, (Por ejemplo, si coinciden tipo_liga e id_eq_l) pues no deje insertarlos. ¿Cómo podría hacer eso?

Alvaro Montoro
  • 48,157
  • 26
  • 100
  • 179
  • [https://www.youtube.com/watch?v=kmCk0ozr5VQ] Revisa este video esta es una forma de insertar datos. – Leonel Apr 16 '18 at 14:01
  • 2
    Hola, ¿podrías proporcionar mas información sobre tu problema? como la tabla en la que quieres insertar tus datos – the-breaker Apr 16 '18 at 14:04
  • Saludos, por favor coloca como esta definida la tabla donde vas a hacer el insert?. Y cuales datos son los que quieres que no se repitan. – joalquipe Apr 16 '18 at 14:10
  • Busca en el sitio porque esta pregunta debería tener respuesta (se hicieron un par de publicaciones similares esta semana). Además, te recomiendo lee [ask] y cómo crear un [mcve]. Tal y como está redactada la pregunta, es demasiado amplia. – Alvaro Montoro Apr 16 '18 at 14:11
  • @AlvaroMontoro Hola, si eres tan amable de llevarme a la pregunta que según ud, ya tiene la respuesta, se lo agradecería y eliminaría esta –  Apr 16 '18 at 14:14
  • 1
    @JaviT algunos ejemplos de preguntas similares: [¿Cómo evitar registros duplicados en mi base de datos?](https://es.stackoverflow.com/q/146873/250), [Problema al evitar el registro de usuarios duplicados PHP - MYSQL](https://es.stackoverflow.com/q/22851/250), [Registros duplicados en mysql](https://es.stackoverflow.com/q/152616/250). Aunque las preguntas no son exactamente iguales, la idea al final será similar: haz una select que compruebe los valores antes de la inserción, o haz campos UNIQUE (en este caso `tipo_liga` e `id_eq_l`) y verifica si la inserción da error. – Alvaro Montoro Apr 16 '18 at 14:21
  • @AlvaroMontoro gracias por tu ayuda, he comprendido y analice los enlaces a las respuestas. Saludos –  Apr 16 '18 at 14:47

2 Answers2

2

En tu tabla creas un unique constraint con esas dos columnas. Algo como esto:

  alter table enfrentamientos add unique ´unique keys´ (´tipo_liga´,´id_eq_l´);

Con eso no te deberia dejar insertar valores duplicados para esas dos columnas.

Otra forma sería hacer select filtrando por esas dos columnas antes de hacer el insert. Pero no sería muy confiable porque si tienes multiples usuario accediendo a tu aplicación podría darse el que caso donde se inserten resultados duplicados.

Mejor que la BD se encargue de eso de una vez. Por eso preferiría crear un constraint en la tabla.

Saludos, espero te sea de ayuda.

joalquipe
  • 133
  • 4
0

espero que esto te ayude,

<?php 
include_once "conexion.php";
try {  

  $pdo->beginTransaction();

  $result = $pdo->exec("insert into users (name, last_name, email, password) values ('Juan Leo', 'Juan leo/','juan@correo.com','123445')");
   $result = $pdo->exec("insert into users (name, last_name, email, password) values ('Laura', 'lau/','laura@correo.com','123445')");

  if($result > 0){
    echo "Datos agregados! :)";
  }

  $pdo->commit();

} catch (Exception $e) {
  $pdo->rollBack();
  echo "Fallo: " . $e->getMessage();
}

?>

Esta es una forma haciendolo con transacciones,

y esta es con el uso de ajax,

<?php
include_once "conexion.php";
if(isset($_POST)){
    if(isset($_POST['name']) &&
        isset($_POST['last_name']) &&
        isset($_POST['email']) &&
        isset($_POST['password'])){
        $nombre = $_POST['name'];
        $last_name = $_POST['last_name'];
        $email = $_POST['email'];
        $password = $_POST['password'];

        $respuesta;
        //Ejecutar una sentencia preparada vinculando varialbes de PHP
        $hash = password_hash( $password, PASSWORD_DEFAULT );
        $gsent = $pdo->prepare('INSERT INTO users (name, last_name, email, password)
                                        VALUES (:name,:last_name,:email,:password)');
        $gsent->bindParam(':name', $nombre, PDO::PARAM_STR);
        $gsent->bindParam(':last_name', $last_name, PDO::PARAM_STR);
        $gsent->bindParam(':email', $email, PDO::PARAM_STR);
        $gsent->bindParam(':password', $hash, PDO::PARAM_STR);
        $state= $gsent->execute();
        $pdo= null;
        if($state){
            $respuesta = array("estado"=>true, "mensaje"=>"Datos ingresados Correctamente!");
        }
        else{
            $respuesta = array("estado"=>false, "mensaje"=>"Error al ingresar los datos!");
        }

        echo json_encode($respuesta);
    }
}
?>

En si, los datos los cuales no se debn de repetir son los identificadores o llaves primarias, de cada tabla. podria ser auto incremental, ahora podria decirse que si existe algun registro, por ejemplo una tabla usuarios, no quieres que los nombres de usuario se repitan, podrias realizar primero un select y si existe un nombre similar, que le indique ese nombre ya esta ocupado, de lo contrario, que inserte el valor.. Espero te ayude..

Leonel
  • 826
  • 8
  • 20
  • 2
    Esto realmente no responde a la pregunta (o lo hace de una manera tangencial). Los ejemplos de código son sólo para inserciones y la prevención de inserción si hay datos repetidos (que es lo que quiere el autor de la pregunta) es sólo una nota al pie. Deberías editar la respuesta para aclarar eso último. – Alvaro Montoro Apr 16 '18 at 14:15
  • Gracias, es de ayuda pero creo que no es lo que busco, he editado el #1 si puedes, echale un vistazo, gracias –  Apr 16 '18 at 14:15