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も表示されない(ここ重要)。

ということで、PHPPythonなどの言語側で「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>