sql >> Databasteknik >  >> RDS >> Mysql

Kontrollera om rad finns i databasen innan du infogar

Det är bättre att sätta en begränsning på dina kolumner för att förhindra dubbletter av data istället för att kontrollera och infoga.

Ange bara en UNIK begränsning på imdbid :

ALTER TABLE `requests` ADD UNIQUE `imdbid_unique`(`imdbid`);

Anledningen till att du gör detta är så att du inte stöter på ett racetillstånd .

Det finns ett litet fönster mellan att slutföra kontrollen och att faktiskt infoga data, och i det lilla fönstret kan data infogas som kommer i konflikt med data som ska infogas.

Lösning? Använd begränsningar och kontrollera $DBH->error() för insättningsfel. Om det finns några fel vet du att det finns en dubblett och du kan meddela din användare då.

Jag märkte att du använder detta, $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); . I det här fallet behöver du inte kontrollera ->error() eftersom PDO kommer att ge ett undantag. Lägg bara in din exekvering med try and catch så här:

$duplicate = false;

try {
    $STH->execute();
} catch (Exception $e) {
    echo "<p>Failed to Request ".$_POST['imdbid']."!</p>";
    $duplicate = true;
}

if (!$duplicate)
    echo "<p>Successfully Requested ".$_POST['imdbid']."! Thanks!</p>";


  1. SQL-fråga för att visa närmaste datum?

  2. Django + Postgres + Large Time Series

  3. Hur väljer jag effektivt det tidigare icke-nullvärdet?

  4. SQL-fel:0, SQLState:08S01 Kommunikationslänkfel