バッチ挿入操作を実行すると、挿入無視または重複してキーアップデートが使用されている場合、MySQLはエラーを直接報告せず、警告を生成します。現時点では、エラーキャプチャメカニズムを介して特定の競合情報を取得することは困難です。 mysqli :: get_warnings()は、これらの警告を取得して、どのレコードが競合するかを理解するのに役立ちます。
次のデータテーブルユーザーがあると仮定し、一意のキーメールが定義されています。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100) UNIQUE
);
複数のデータをバッチに挿入しようとします。
<?php
$mysqli = new mysqli("localhost", "root", "password", "testdb");
if ($mysqli->connect_errno) {
die("データベースに接続できませんでした: " . $mysqli->connect_error);
}
// バッチ挿入を準備しますSQL声明
$sql = "INSERT IGNORE INTO users (name, email) VALUES
('Alice', '[email protected]'),
('Bob', '[email protected]'),
('Charlie', '[email protected]')"; // に注意してくださいemail繰り返す
if ($mysqli->query($sql)) {
echo "完全に挿入します。<br>";
// 合格 get_warnings() 检测是否有繰り返す键冲突警告
if ($warning = $mysqli->get_warnings()) {
do {
echo "警告レベル: " . $warning->get_errno() . "<br>";
echo "警告メッセージ: " . $warning->get_message() . "<br>";
} while ($warning->next());
} else {
echo "警告メッセージはありません。";
}
} else {
echo "挿入障害: " . $mysqli->error;
}
$mysqli->close();
上記のコードでは、挿入無視を使用してデータを挿入しようとします。重複した電子メールが発生した場合、MySQLはレコードの挿入を無視しますが、警告を生成します。これらの警告情報は、$ mysqli-> get_warnings()を使用して取得して、重複するキー競合があることを知ることができます。
mysqli :: get_warnings() mysqli_warningオブジェクトを返します。次の方法を呼び出して詳細情報を取得できます。
get_errno() :警告のエラーコードを取得します
get_message() :警告メッセージテキストを取得します
次() :次の警告に移動します(ある場合)
通常、繰り返される主要な競合の警告コードは1062であり、対応するメッセージには「重複するエントリ」が含まれます。
INSERTが無視されているか、同様のポリシーが使用されない場合、重複する重要な競合により、クエリが故障し、警告ではなくエラーを返す可能性があります。
get_warnings()は警告チェーンを返し、すべての警告を取得するにはループトラバーサルが必要です。
警告情報は比較的詳細であり、競合するレコードを正確に見つけるために使用できます。
mysqli :: get_warnings()を介して、バッチ挿入中に重複するキー競合をよりエレガントに処理できます。これにより、データ挿入の連続性が保証されるだけでなく、データの品質の問題を迅速に理解し、プログラムの堅牢性を向上させます。
<?php
$mysqli = new mysqli("localhost", "root", "password", "testdb");
if ($mysqli->connect_errno) {
die("データベースに接続できませんでした: " . $mysqli->connect_error);
}
$sql = "INSERT IGNORE INTO users (name, email) VALUES
('Alice', '[email protected]'),
('Bob', '[email protected]'),
('Charlie', '[email protected]')";
if ($mysqli->query($sql)) {
echo "完全に挿入します。<br>";
if ($warning = $mysqli->get_warnings()) {
do {
echo "警告レベル: " . $warning->get_errno() . "<br>";
echo "警告メッセージ: " . $warning->get_message() . "<br>";
} while ($warning->next());
} else {
echo "警告メッセージはありません。";
}
} else {
echo "挿入障害: " . $mysqli->error;
}
$mysqli->close();