【開発経験】mysqlはデータベースが削除されて暴走するのを効果的に防ぎます!


個人的なミスにより、一部の開発者が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=1updateステートメントを正常に実行するには、次のいずれかの条件を満たす必要があります。

  1. where句を使用し、where句の列はプレフィックスインデックス列である必要があります
  2. 使用制限
  3. where句とlimitを同時に使用します(where句の列は現時点ではインデックス列ではない可能性があります)

deleteステートメントを正常に実行するには、次のいずれかの条件を満たす必要があります

  1. where句を使用し、where句の列はプレフィックスインデックス列である必要があります

  2. 正常に実行するには、where句とlimitを同時に使用します(where句の列は現時点ではインデックス列ではない可能性があります) 。

おすすめ

転載: blog.csdn.net/qq_30285985/article/details/120525460