배치 삽입 작업을 실행할 때 삽입 무시 또는 중복 키 업데이트가 사용되면 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이며 해당 메시지에는 "중복 항목"이 포함됩니다.
삽입 무시 또는 유사한 정책이 사용되지 않으면 중복 주요 충돌로 인해 쿼리가 직접 실패하여 경고가 아닌 오류를 반환 할 수 있습니다.
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();