我有两个表:movies
和genres
,以及movieOfGenre
和movies
表之间多对多关系的联结表genres
。现在,当我使用事务使用PHP将电影和流派插入到我的数据库中时,即使存在重复,也会创建两次类型。然后我使用...ON DUPLICATE KEY UPDATE...
更新了代码,现在如果存在具有相同名称的现有类型,则在使用此事务查询时,正在更新现有类型的auto_increment 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);
}
如何编写查询,以便在插入过程中存在具有相同genre.name
的现有行时,它会返回现有行的ID而不更新它?
提前致谢。
答案 0 :(得分:2)
genres.name
应该是一个独特的列:
CREATE TABLE genres
...
UNIQUE KEY name
使用IGNORE
- 不会抛出重复的异常
INSERT IGNORE INTO genres (name) VALUES (?)
按名称获取ID:
SELECT id FROM genres WHERE name = ?
答案 1 :(得分:1)
我不确定这个帮助,但您可能需要查看下面的示例。懒惰这几天做PHP编码,但如果我正确理解你的问题,我上次有类似的MYSQL问题:P
INSERT INTO sample_table (unique_id, code) VALUES ('$unique_id', '$code')
ON DUPLICATE KEY UPDATE code= '$code'
希望这可以解决您的问题