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

MySQL安全な更新モードを使用していて、WHEREなしでテーブルを更新しようとしました

    MySQL5.6はUPDATEの実行に制限があるようです JOINとともにステートメント

    したがって、

    の代わりに
    UPDATE table1 a
    INNER JOIN table2 asa
    ON a.ID = asa.Table1Id
    SET a.ReferenceID = asa.ReferenceID
    WHERE a.ID > 0 AND asa.ID > 0
    

    次のように、必要な数のクエリを作成する必要があります:

    UPDATE table1 a
    SET a.ReferenceID = <The corresponding value in table 2>
    WHERE a.ID = <The corresponding ID>
    

    これは入力するのがかなり面倒なので、動的SQLを使用して更新クエリを作成できます:

    SELECT CONCAT('UPDATE table1 a SET a.ReferenceID = ', asa.ReferenceID, ' WHERE a.ID = ', t.ID, ';')
    FROM table1 t
    INNER JOIN table2 asa
    ON t.ID = asa.Table1Id;
    

    例:

    スキーマ(MySQL v5.6)

    CREATE TABLE test
    (
        id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        foo VARCHAR(255)
    );
    
    CREATE TABLE test2
    (
        id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        id_test INT NOT NULL,
        foo VARCHAR(255),
        FOREIGN KEY (id_test) REFERENCES test(id)
    );
    
    INSERT INTO test (foo) VALUES ('hello'), ('world');
    
    INSERT INTO test2 (id_test, foo) VALUES (1, 'bar'), (2, 'baz');
    

    クエリ#1

    SELECT CONCAT('UPDATE test t SET t.foo = ''', t2.foo, ''' WHERE t.id = ', t.id, ';') AS 'sql query'
    FROM test t
    INNER JOIN test2 t2
    ON t.id = t2.id_test;
    

    この出力:

    UPDATE test t SET t.foo = 'bar' WHERE t.id = 1;
    UPDATE test t SET t.foo = 'baz' WHERE t.id = 2;
    

    出力を使用して手動でできるようになりました 異なる行を更新する

    DBフィドルで表示



    1. フィルタされたインデックスによるオプティマイザの制限

    2. SQLite SUBSTRING()の説明

    3. LinuxにSQLServerをインストールする方法

    4. 繰り返されるキーのMysqlgroup_concatと1つのクエリでの複数の列の繰り返しのカウント(クエリ最適化)