sql >> データベース >  >> RDS >> Mysql

複数のUNIQUEフィールドに対するONDUPLICATEKEYUPDATEのMySQLの動作

    検討する

    INSERT INTO table (a,b,c) VALUES (1,2,3)
        -> ON DUPLICATE KEY UPDATE c=c+1;
    

    aとbがUNIQUEの場合 フィールド、UPDATE a = 1 OR b = 2で発生します 。条件a = 1 OR b = 2の場合も 2つ以上のエントリが満たされている場合、更新は1回だけ行われます。

    ここに、IDと名前がUNIQUEのテーブルテーブルがあります。 フィールド

    Id     Name     Value 
    1      P        2 
    2      C        3 
    3      D        29 
    4      A        6
    

    クエリが

    の場合
    INSERT INTO table (Id, Name, Value)
    VALUES (1, C, 7);
    

    次に

    Id     Name     Value 
    1      P        2 
    2      C        3 
    3      D        29 
    4      A        6
    1      C        7
    

    これは、IDと名前の一意性に違反します。今

    INSERT INTO table (Id, Name, Value)
    VALUES (1, C, 7)
    ON DUPLICATE KEY UPDATE Value = 7;
    

    取得します

    Id     Name     Value 
    1      P        7 
    2      C        7 
    3      D        29 
    4      A        6
    

    複数のキーでの動作は次のとおりです

    UPDATE ON DUPLICATE KEY UPDATE UNIQUEのいずれかが実行される場合 フィールドは挿入される値と同じです。ここで、UPDATE Id = 1 OR Name = Cで実行されます 。

    と同等です
    UPDATE table 
    SET Value = 7
    WHERE Id = 1 OR Name = C;
    

    どちらかのキーについて、1つの更新のみが必要な場合はどうなりますか

    UPDATEを使用できます LIMITを含むステートメント キーワード

    UPDATE table 
    SET Value = 7
    WHERE Id = 1 OR Name = C
    LIMIT 1;
    

    与えるだろう

    Id     Name     Value 
    1      P        7 
    2      C        3 
    3      D        29 
    4      A        6
    

    両方のキーの値が一致する場合にのみ1つの更新が必要な場合はどうなりますか

    1つの解決策は、ALTER TABLE PRIMARY KEYを作成します (または独自性)両方の分野で機能します。

    ALTER TABLE table 
    DROP PRIMARY KEY,
    ADD PRIMARY KEY (Id, Name);
    

    さて、

    INSERT INTO table (Id, Name, Value)
    VALUES (1, C, 7)
    ON DUPLICATE KEY UPDATE Value = 7;
    

    取得します

    Id     Name     Value 
    1      P        2 
    2      C        3 
    3      D        29 
    4      A        6
    1      C        7
    

    (両方のキーに)重複が見つからないため。



    1. mysqlデータベースの行ごとに一意のphpページを作成するにはどうすればよいですか?

    2. VS2015シェルにOledbのOracleプロバイダーがありません

    3. SQL Serverで「datetime」を「time」に変換する(T-SQLの例)

    4. 結合されたMySQLテーブルの最新の日付のみを表示する