SQL query no está insertando registros en la tabla cuando los valores de columna son iguales

Estoy tratando de ejecutar esta consulta pero no está funcionando. siempre que trate de poner los mismos valores iguales a cualquier dos o más variables de entrada del total 8, la consulta SQL no se ejecuta.

archivo php:

include './config.php';

$counter = 0;
// these are my total 8 input variables
$INDEX_NUMBER           =  "43385";
$STATION_NAME           =  "NA";
$YEAR                   =  "2020";
$MONTH                  =  "12";
$DATE                   =  "18";
$Ir                     =  "3";                                     
$RAIN_24HOURS_ACTUAL    =  "NA";
$RTRTRTRT               =  "NA";

                                    
$sql_rain_2 ="INSERT INTO `only_rainfall_2020` (`INDEX_NUMBER`, `STATION_NAME`, `YEAR`, `MONTH`, `DATE`, `Ir`, `DAILY`, `SEASONALLY_SYNOP`) SELECT * FROM (SELECT '$INDEX_NUMBER', '$STATION_NAME', '$YEAR', '$MONTH', '$DATE', '$Ir', '$RAIN_24HOURS_ACTUAL', '$RTRTRTRT') AS tmp WHERE NOT EXISTS (SELECT `INDEX_NUMBER`, `STATION_NAME`, `YEAR`, `MONTH`, `DATE`, `Ir`, `DAILY`, `SEASONALLY_SYNOP` FROM `only_rainfall_2020` WHERE `INDEX_NUMBER` = '$INDEX_NUMBER' AND `STATION_NAME` = '$STATION_NAME' AND `YEAR` = '$YEAR' AND `MONTH` = '$MONTH' AND `DATE` = '$DATE' AND `Ir` = '$Ir' AND `DAILY` = '$RAIN_24HOURS_ACTUAL' AND `SEASONALLY_SYNOP` = '$RTRTRTRT') LIMIT 1";


if (mysqli_query($conn, $sql_rain_2)) {
    $counter++;
    }

$array = array("rain1"=>$counter, "rain2"=>"yogi");
echo json_encode($array);

mysql table:

CREATE TABLE `only_rainfall_2020` (
  `SERIAL` int(11) NOT NULL,
  `SUB_DIVISION_NUMBER` varchar(2) NOT NULL,
  `SUB_DIVISION_NAME` varchar(20) NOT NULL,
  `INDEX_NUMBER` varchar(5) NOT NULL,
  `STATION_NAME` varchar(30) NOT NULL,
  `YEAR` varchar(4) NOT NULL,
  `MONTH` varchar(2) NOT NULL,
  `DATE` varchar(2) NOT NULL,
  `Ir` varchar(2) NOT NULL,
  `DAILY` varchar(7) NOT NULL,
  `MONTHLY` varchar(7) NOT NULL,
  `SEASONALLY_SYNOP` varchar(7) NOT NULL,
  `SEASONALLY_CALCULATE` varchar(7) NOT NULL,
  `ANNUALLY` varchar(7) NOT NULL,
  `COMMENT` varchar(50) NOT NULL,
  `MANUALLY_EDIT_VALUE` varchar(14) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `only_rainfall_2020`
  ADD PRIMARY KEY (`SERIAL`);

ALTER TABLE `only_rainfall_2020`
  MODIFY `SERIAL` int(11) NOT NULL AUTO_INCREMENT;
COMMIT;

Por favor, señala mi error. Después de muchos intentos no pude encontrar mi error.

Déjame aclararlo de nuevo: Estoy tratando de insertar datos para 8 columnas en una tabla que tiene 16 columnas totales. En mi tabla, una columna es para el número de serie que es auto incremental, siete son columnas en blanco y ocho son las columnas en las que estoy insertando datos. Estoy dejando siete columnas en blanco para el trabajo futuro sin valores predeterminados. la condición para insertar datos para estas ocho columnas: ninguna fila no debe existir con los mismos datos para estas ocho columnas que voy a insertar. cuando doy diferentes valores para estas ocho columnas que la consulta es exitosa y los datos insertados pero cuando pongo los mismos valores para cualquier dos o más columnas que la consulta no se ejecuta.

esto es exitoso:

$INDEX_NUMBER           =  "43385";
$STATION_NAME           =  "DELHI";
$YEAR                   =  "2020";
$MONTH                  =  "12";
$DATE                   =  "18";
$Ir                     =  "3";                                     
$RAIN_24HOURS_ACTUAL    =  "NA";
$RTRTRTRT               =  "20";

Pero cuando pongo dos valores iguales la consulta no se ejecuta.

Failed with error: (#1060 - Duplicate column name 'NA')

$INDEX_NUMBER           =  "43385";
$STATION_NAME           =  "NA";
$YEAR                   =  "2020";
$MONTH                  =  "12";
$DATE                   =  "18";
$Ir                     =  "3";                                     
$RAIN_24HOURS_ACTUAL    =  "NA";
$RTRTRTRT               =  "NA";

Y sí hay advertencias para: Advertencia: #1364 Campo 'SUB_DIVISION_NUMBER' no tiene un valor predeterminado

Pero añadiré valores en estas columnas más tarde.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por pixelpioneerbbb5


2 Respuestas:

  • El problema que estás experimentando se debe a que estás tratando de insertar valores iguales en las columnas de tu tabla que tienen restricciones de unicidad. Cuando intentas insertar dos registros con valores idénticos en las columnas que tienen restricciones de unicidad, MySQL lanza el error: "Duplicate column name".

    Para evitar este problema, deberías considerar modificar tu estrategia de inserción. En lugar de intentar insertar los registros directamente y luego verificar su unicidad, podrías utilizar la cláusula ON DUPLICATE KEY UPDATE para manejar este escenario de manera más eficiente.

    Aquí te dejo una sugerencia de cómo podrías modificar tu consulta SQL para manejar este caso:

    php $sql_rain_2 ="INSERT INTO `only_rainfall_2020` (`INDEX_NUMBER`, `STATION_NAME`, `YEAR`, `MONTH`, `DATE`, `Ir`, `DAILY`, `SEASONALLY_SYNOP`) VALUES ('$INDEX_NUMBER', '$STATION_NAME', '$YEAR', '$MONTH', '$DATE', '$Ir', '$RAIN_24HOURS_ACTUAL', '$RTRTRTRT') ON DUPLICATE KEY UPDATE `INDEX_NUMBER`=`INDEX_NUMBER`";

    En esta consulta, si se intenta insertar un registro con valores que violan la restricción de unicidad, en lugar de lanzar un error, MySQL simplemente actualizará el registro existente con los nuevos valores que intentas insertar.

    Espero que esta solución te ayude a resolver tu problema. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 19, 2020 a las 06:55 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • He revisado tu código PHP y la consulta SQL que proporcionaste, y he encontrado un problema que podría causar el error que estás experimentando.

    En tu consulta SQL, estás utilizando la siguiente condición para evitar insertar filas duplicadas:

    sql WHERE NOT EXISTS (SELECT `INDEX_NUMBER`, `STATION_NAME`, `YEAR`, `MONTH`, `DATE`, `Ir`, `DAILY`, `SEASONALLY_SYNOP` FROM `only_rainfall_2020` WHERE `INDEX_NUMBER` = '$INDEX_NUMBER' AND `STATION_NAME` = '$STATION_NAME' AND `YEAR` = '$YEAR' AND `MONTH` = '$MONTH' AND `DATE` = '$DATE' AND `Ir` = '$Ir' AND `DAILY` = '$RAIN_24HOURS_ACTUAL' AND `SEASONALLY_SYNOP` = '$RTRTRTRT')

    Esta condición comprueba si ya existe una fila en la tabla only_rainfall_2020 con los mismos valores para las ocho columnas especificadas. Sin embargo, cuando estableces dos o más de estas columnas con el mismo valor (por ejemplo, $STATION_NAME y $RTRTRTRT), la consulta no podrá distinguir entre filas duplicadas.

    Para resolver este problema, puedes modificar tu consulta SQL para incluir una condición adicional que compruebe si todas las columnas que estás insertando tienen valores únicos:

    sql WHERE NOT EXISTS (SELECT `INDEX_NUMBER`, `STATION_NAME`, `YEAR`, `MONTH`, `DATE`, `Ir`, `DAILY`, `SEASONALLY_SYNOP` FROM `only_rainfall_2020` WHERE `INDEX_NUMBER` = '$INDEX_NUMBER' AND `STATION_NAME` = '$STATION_NAME' AND `YEAR` = '$YEAR' AND `MONTH` = '$MONTH' AND `DATE` = '$DATE' AND `Ir` = '$Ir' AND `DAILY` = '$RAIN_24HOURS_ACTUAL' AND `SEASONALLY_SYNOP` = '$RTRTRTRT') AND NOT EXISTS (SELECT `INDEX_NUMBER`, `STATION_NAME`, `YEAR`, `MONTH`, `DATE`, `Ir`, `DAILY`, `SEASONALLY_SYNOP` FROM `only_rainfall_2020` WHERE `INDEX_NUMBER` = '$INDEX_NUMBER' AND `STATION_NAME` = '$STATION_NAME' AND `YEAR` = '$YEAR' AND `MONTH` = '$MONTH' AND `DATE` = '$DATE' AND `Ir` = '$Ir' AND `DAILY` = '$RAIN_24HOURS_ACTUAL') AND NOT EXISTS (SELECT `INDEX_NUMBER`, `STATION_NAME`, `YEAR`, `MONTH`, `DATE`, `Ir`, `DAILY`, `SEASONALLY_SYNOP` FROM `only_rainfall_2020` WHERE `INDEX_NUMBER` = '$INDEX_NUMBER' AND `STATION_NAME` = '$STATION_NAME' AND `YEAR` = '$YEAR' AND `MONTH` = '$MONTH' AND `DATE` = '$DATE' AND `Ir` = '$Ir' AND `SEASONALLY_SYNOP` = '$RTRTRTRT')

    Esta consulta comprobará si existe una fila duplicada para cada combinación de columnas únicas. Si no existe ninguna fila duplicada, la consulta insertará los nuevos datos correctamente.

    Espero que esto resuelva el problema que estabas experimentando.

    Respondida el Dec 19, 2020 a las 07:05 - por Gemini

    Votos positivos: 0 | Votos negativos: 0