web-dev-qa-db-ja.com

MySQLエラー:UPDATEとLIMITの誤った使用法

MySQLコードが正しく機能するように、この問題を修正するにはどうすればよいですか。

これが私に問題を与える私のMySQLコードです。

$q = "UPDATE users INNER JOIN contact_info ON contact_info.user_id = users.user_id SET active.users = NULL WHERE (email.contact_info = '" . mysqli_real_escape_string($mysqli, $x) . "' AND active.users = '" . mysqli_real_escape_string($mysqli, $y) . "') LIMIT 1";
$r = mysqli_query ($mysqli, $q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($mysqli));
24
HELP

[〜#〜] update [〜#〜] のMySQLドキュメントによると:

複数テーブル構文の場合、UPDATEは、条件を満たすtable_referencesで指定された各テーブルの行を更新します。この場合、ORDERBYとLIMITは使用できません。

48
Marc B

**​​ mysqlのlimitを使用して複数の行を更新する場合...直接制限を使用することはできません** ==

UPDATE table_name SET name='test'
     WHERE id IN (
         SELECT id FROM (
             SELECT id FROM table_name 
             ORDER BY id ASC  
             LIMIT 0, 10
         ) tmp
     );
18
Roopchand

複数テーブル構文の場合、UPDATEは、条件を満たすtable_referencesで指定された各テーブルの行を更新します。この場合、 ORDER BYおよびLIMITは使用できません

3
Kamran Mushtaq

@Marc Bは、updateが通常limitで機能しない理由を示しています。

また、@ Roopchandもソリューションを提供します。

safe update modeをオフにしないようにしようとしている私のような人々のために

https://stackoverflow.com/a/28316067/1278112
この回答は非常に役立ちます。例を挙げます

顧客の更新SETcountryCode = 'USA' WHERE country = 'USA'; -これはエラーを出します、あなたはただ書くだけです:

UPDATE顧客SETcountryCode = 'USA' WHERE(country = 'USA' AND customerNumber <> 0); --customerNumberは主キーであるため、エラー1175は発生しなくなりました。

また、複数テーブルの構文でupdateに直面すると、それも機能しました。

私が欲しいのですが、エラーコード1175が発生します。

UPDATE table1 t1
        INNER JOIN
    table2 t2 ON t1.name = t2.name 
SET 
    t1.column = t2.column
WHERE
    t1.name = t2.name;

ワーキングエディション

UPDATE table1 t1
        INNER JOIN
    table2 t2 ON t1.name = t2.name 
SET 
    t1.column = t2.column
WHERE
    (t1.name = t2.name and t1.prime_key !=0);

これは本当にシンプルでエレガントです。元の回答はあまり注目されていない(投票)ので、もっと説明を投稿します。これが他の人を助けることができることを願っています。

1
Shihe Zhang

私はそれが古い質問であることを知っていますが、それはこのエラーをグーグルで検索するときの最初のリンクです。サブクエリを使用することで、パフォーマンスの問題(インデックスによって異なります)なしでこの問題を解決するための回避策があります。

UPDATE table1 t1
JOIN (SELECT t1.id
    FROM table1 t1
    JOIN table2 t2 ON t1.id = t2.id
        AND t2.some_criteria = 'some_value'
    WHERE t1.other_criteria = 'other_value'
    LIMIT 10000
) tmp ON tmp.id = t1.id
SET t1.field_to_update = 'new_value'

LIMITはサブクエリ内にあるため、結合はLIMIT句の数行のみに一致し、クエリはこれらの行のみを更新します。

0
Shaolin