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));
[〜#〜] update [〜#〜] のMySQLドキュメントによると:
複数テーブル構文の場合、UPDATEは、条件を満たすtable_referencesで指定された各テーブルの行を更新します。この場合、ORDERBYとLIMITは使用できません。
** 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
);
複数テーブル構文の場合、UPDATE
は、条件を満たすtable_referencesで指定された各テーブルの行を更新します。この場合、 ORDER BY
およびLIMIT
は使用できません
@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);
これは本当にシンプルでエレガントです。元の回答はあまり注目されていない(投票)ので、もっと説明を投稿します。これが他の人を助けることができることを願っています。
私はそれが古い質問であることを知っていますが、それはこのエラーをグーグルで検索するときの最初のリンクです。サブクエリを使用することで、パフォーマンスの問題(インデックスによって異なります)なしでこの問題を解決するための回避策があります。
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句の数行のみに一致し、クエリはこれらの行のみを更新します。