2017-07-21 4 views
0

moviesgenresの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を返します。

ありがとうございます。

+2

あなたは、インサートから直接その値を取得することはできません。しかし、mysqli_insert_idをクエリするのではなく、別の 'select'を実行してからクエリを実行するだけです。 Btwの場合、idを更新するのは悪い考えです(たとえば、そのジャンルの 'movieofgenre'のすべてのエントリが役に立たなくなるか、更新する必要があるため)。 – Solarflare

答えて

2
  1. genres.nameは一意の列でなければなりませんP

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

    希望解決:この日のコーディングPHPを行うには、しかし、私は私が正しくあなたの問題を理解していればMYSQLと同様の問題の最後の時間を持っているレイジー:

    CREATE TABLE genres 
    ... 
    UNIQUE KEY name 
    
  2. 使用IGNORE - 重複した例外がスローされることはありません

    INSERT IGNORE INTO genres (name) VALUES (?) 
    
  3. 名前でIDを取得:

    SELECT id FROM genres WHERE name = ? 
    
1

このヘルプはよくわかりませんが、下記の例を確認してください。これはあなたの問題

関連する問題