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

时间:2017-07-21 17:14:04

标签: php mysql

我有两个表:moviesgenres,以及movieOfGenremovies表之间多对多关系的联结表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而不更新它?

提前致谢。

2 个答案:

答案 0 :(得分:2)

  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 = ?
    

答案 1 :(得分:1)

我不确定这个帮助,但您可能需要查看下面的示例。懒惰这几天做PHP编码,但如果我正确理解你的问题,我上次有类似的MYSQL问题:P

INSERT INTO sample_table (unique_id, code) VALUES ('$unique_id', '$code')
ON DUPLICATE KEY UPDATE code= '$code'

希望这可以解决您的问题