SQLとER_DUP_ENTRY例外1062についてまとめ
1. UNIQUEキーを設定せずに通常通りにINSERTすると
重複データが挿入されてしまう。
2. UNIQUEキーを設定せずにWHERE NOT EXISTSでINSERTすると
重複データは挿入されないが、Warningも表示されない(ここ重要)。
3. UNIQUEキーを設定せずにINSERT IGNOREでINSERTすると
重複データは挿入されないが、Warningも表示されない(ここ重要)。
4. UNIQUEキーを設定して通常通りにINSERTすると
ER_DUP_ENTRYエラーが発生しデータの挿入はなされない。
5. UNIQUEキーを設定してWHERE NOT EXISTSでINSERTすると
重複データは挿入されないが、Warningも表示されない(ここ重要)。
6. UNIQUEキーを設定してINSERT IGNOREでINSERTすると
重複データは挿入されないが、Warningも表示されない(ここ重要)。
ということで、PHPやPythonなどの言語側で「SQL文を実行したがWarningが生じてしまった」
ことをtry~catch構文で例外処理する場合、UNIQUEキーを設定したうえで
通常通りのSQL文でデータを挿入することになる。
PHPコード:
<?php $id = "5"; $name = "Test 5"; // DB connection info $user = 'dbuser1'; $pass = '12ab'; try { // Connect to DB $dsn = 'mysql:host=localhost;dbname=php_enquete;charset=utf8mb4'; $conn = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); // Add data $sql = "INSERT IGNORE INTO s_table1(id, name) SELECT '$id', '$name'"; //$sql = "INSERT INTO s_table1(id, name) SELECT '$id', '$name' FROM dual WHERE NOT EXISTS (SELE CT 1 FROM s_table1 WHERE name = '$name')"; $stmt = $conn -> prepare($sql); $ret = $stmt -> execute(); } catch (PDOException $e) { var_dump($e->getMessage()); if (strpos($e->getMessage(), '1062') !== false) { echo "ER_DUP_ENTRY: すでに送信済みのデータです"; } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Registered!</title> </head> <body> <p>Thank you for the registration.</p> <p><a href="input.php">入力画面に戻る</a></p> </body></html>