movies
とgenres
の2つのテーブルと、movies
テーブルとgenres
テーブルの多対多の関係の接合テーブルmovieOfGenre
があります。今、PHPを使用してデータベースに映画やジャンルを挿入するトランザクションを使用しているときに、重複があってもジャンルは2回作成されています。MySQL INSERT中に重複した行がある場合、既存の行のIDを返す方法は?
mysqli_autocommit($connect, false);
$query_success = true;
$stmt = $connect->prepare("INSERT INTO movies (id, title, plot, rating, releaseDate, duration, language, country, posterUrl, trailerUrl) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->bind_param("ssssssssss", $defaultId, $title, $plot, $rating, $releaseDate, $duration, $language, $country, $poster, $trailer);
if (!$stmt->execute()) {
$query_success = false;
}
$movieId = mysqli_insert_id($connect);
$stmt->close();
foreach ($genres as $genre) {
$stmt = $connect->prepare("INSERT INTO genres (id, name) VALUES (?, ?) ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID()");
$stmt->bind_param("ss", $defaultId, $genre);
if (!$stmt->execute()) {
$query_success = false;
}
$genreId = mysqli_insert_id($connect);
$stmt->close();
$stmt = $connect->prepare("INSERT INTO movieofgenre (movieId, genreId) VALUES (?, ?)");
$stmt->bind_param("ii", $movieId, $genreId);
if (!$stmt->execute()) {
$query_success = false;
}
$stmt->close();
}
if ($query_success) {
mysqli_commit($connect);
} else { ?>
alert('Error adding movie.');
<?php mysqli_rollback($connect);
}
私は、クエリを書くにはどうすればよい:同じ名前の既存のジャンルがあるかどうかそれから私は、今...ON DUPLICATE KEY UPDATE...
として、私は、このトランザクションのクエリを使用する場合、既存のジャンルが更新されているのAUTO_INCREMENTのIDをコードを更新しました挿入中に同じgenre.name
の既存の行がある場合は、更新せずに既存の行のIDを返します。
ありがとうございます。
あなたは、インサートから直接その値を取得することはできません。しかし、mysqli_insert_idをクエリするのではなく、別の 'select'を実行してからクエリを実行するだけです。 Btwの場合、idを更新するのは悪い考えです(たとえば、そのジャンルの 'movieofgenre'のすべてのエントリが役に立たなくなるか、更新する必要があるため)。 – Solarflare