個人的なミスにより、一部の開発者がdeleteまたはupdateステートメントにwhereステートメントを追加しなかったため、テーブルデータ全体が混乱したことを聞いたことがあるはずです。
MySQLセキュリティモード:MySQLは、deleteステートメントとupdateステートメントがwhere条件またはlimit条件を追加しないことを検出すると、エラーを報告します。SQL全体が実行されないため、テーブルが誤って削除されるのを効果的に防ぐことができます。
セーフモード設定
mysqlで次のコマンドを使用してステータスを確認します。
show variables like 'sql_safe_updates';
デフォルトはオフ状態です。状態をオンに設定できます。
set sql_safe_updates=1;
//開けるset sql_safe_updates=0;
//閉鎖
オンに設定した後
- 更新ステートメント:where条件で列(列)に使用できるインデックスがなく、制限制限がない場合、更新は拒否されます。where条件が一定で制限がない場合、更新は拒否されます。
- 削除ステートメント: ①条件が一定の場合、②または条件が空の場合、③または列(列)に使用できるインデックスがなく、削除を拒否する制限がない場合。
テスト
セーフモードを開いてテストします
1.場所なしで更新および削除
delete from t_user
delete from t_user
> 1175 - You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
> 时间: 0.001s
update t_user set name='123'
update t_user set name='123'
> 1175 - You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
> 时间: 0.001s
2.非インデックスキーの削除
delete from t_user where name='123'
delete from t_user where name='123'
> 1175 - You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
> 时间: 0.007s
削除のwhere条件がインデックスキーでない場合は、制限を追加する必要があります。
delete from t_user where name='123' limit 1
delete from t_user where name='123' limit 1
> Affected rows: 0
> 时间: 0.002s
3.インデックスキーを削除します
delete from t_user where group_id='123'
delete from t_user where group_id='123'
> Affected rows: 0
> 时间: 0s
要約する
設定されている場合sql_safe_updates=1
、update
ステートメントを正常に実行するには、次のいずれかの条件を満たす必要があります。
- where句を使用し、where句の列はプレフィックスインデックス列である必要があります
- 使用制限
- where句とlimitを同時に使用します(where句の列は現時点ではインデックス列ではない可能性があります)
delete
ステートメントを正常に実行するには、次のいずれかの条件を満たす必要があります
- where句を使用し、where句の列はプレフィックスインデックス列である必要があります
正常に実行するには、where句とlimitを同時に使用します(where句の列は現時点ではインデックス列ではない可能性があります) 。