gpt4 book ai didi

php - 如果在 MySQL INSERT 期间存在重复行,如何返回现有行的 ID?

转载 作者:太空宇宙 更新时间:2023-11-03 11:36:48 24 4
gpt4 key购买 nike

我有两个表:moviesgenres,还有一个联结表 movieOfGenre 用于 之间的多对多关系电影流派 表。现在,当我使用 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 而不更新它?

提前致谢。

最佳答案

  1. genres.name 应该是一个唯一的列:

    CREATE TABLE genres
    ...
    UNIQUE KEY name
  2. 使用IGNORE - 不会抛出重复的异常

    INSERT IGNORE INTO genres (name) VALUES (?)
  3. 通过名字获取id:

    SELECT id FROM genres WHERE name = ?

关于php - 如果在 MySQL INSERT 期间存在重复行,如何返回现有行的 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45243233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com