Detaillierte Erklärung zur Verwendung des MySQL-Parameters sql_safe_updates in der Produktionsumgebung

Detaillierte Erklärung zur Verwendung des MySQL-Parameters sql_safe_updates in der Produktionsumgebung

Vorwort

Im Falle eines Anwendungsfehlers oder einer Fehlbedienung des DBA kann die gesamte Tabelle aktualisiert werden: Update/Löschen. MySQL bietet sql_safe_updates, um diesen Vorgang einzuschränken.

setze sql_safe_updates = 1;

Nach dem Festlegen wird die SQL-Ausführung ohne Where-Bedingungen beim Aktualisieren und Löschen eingeschränkt, was strenger ist. Dies wird sich negativ auf die bestehende Online-Umgebung auswirken. Durch strenge Prüfungen neuer Systeme und Anwendungen kann sichergestellt werden, dass keine vollständigen Tabellenaktualisierungen erfolgen.

Tabelle erstellen: working.test01 (ID INT NICHT NULL AUTO_INCREMENT, NAME VARCHAR (20), Alter INT, gmt_created DATETIME, PRIMARY KEY (ID));

 einfügen in test01(Name, Alter, gmt_created) Werte('xiaowang', 2, jetzt());
 einfügen in test01(Name, Alter, gmt_created) Werte('huahua', 5, jetzt()); 
 einfügen in test01(Name, Alter, gmt_created) Werte('gougou', 9, jetzt()); 
 einfügen in test01(Name, Alter, gmt_created) Werte('heihei', 12, jetzt()); 
 einfügen in test01(Name, Alter, gmt_created) Werte('baibai', 134, jetzt()); 

# Kein Index-Update im Filterfeld
Aktualisiere Test01, setze Name = „xiaoxiao“, wobei Alter = 2;
FEHLER 1175 (HY000): Sie verwenden den abgesicherten Aktualisierungsmodus und haben versucht, eine Tabelle ohne WHERE zu aktualisieren, die eine KEY-Spalte verwendet
# Aktualisieren Sie die gesamte Tabelle. Update Test01. Setname = „xiaoxiao“;
FEHLER 1175 (HY000): Sie verwenden den abgesicherten Aktualisierungsmodus und haben versucht, eine Tabelle ohne WHERE zu aktualisieren, die eine KEY-Spalte verwendet
# Limit-Update hinzufügen, Update test01, Name festlegen = „xia“, Limit 1;
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)
Übereinstimmende Zeilen: 1 Geändert: 1 Warnungen: 0

# Einen neuen Index erstellen create index idx_age on test01(age);

Aktualisiere Test01, setze Namen = „xiaoxiao“, wobei Alter = 2;
Abfrage OK, 1 Zeile betroffen (0,01 Sek.)
Übereinstimmende Zeilen: 1 Geändert: 1 Warnungen: 0

Update Test01, Name festlegen = „hhh“, wobei Alter = 9, Limit 10;
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)
Übereinstimmende Zeilen: 1 Geändert: 1 Warnungen: 0

Tabelle test01 ändern, Index idx_age löschen;
Erstelle den Index idx_age_name für test01(Alter, Name);


Aktualisiere Test01, setze Alter = 100, wobei Name = „hhh“;
FEHLER 1175 (HY000): Sie verwenden den abgesicherten Aktualisierungsmodus und haben versucht, eine Tabelle ohne WHERE zu aktualisieren, die eine KEY-Spalte verwendet

Aktualisiere Test01, setze Alter = 100, wobei Name = „hhh“, Limit 10;
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)
Übereinstimmende Zeilen: 1 Geändert: 1 Warnungen: 0

Wenn beim Aktualisieren keine Where-Bedingung vorhanden ist oder die Where-Bedingung kein Indexfeld ist, muss daher limit verwendet werden; wenn eine Where-Bedingung vorhanden ist, muss das Indexfeld

Kürzlich habe ich bei der Arbeit ein weiteres Problem festgestellt. MySQL sql_safe_updates unterstützt keine Unterabfrage-Updates.

Da Entwickler Daten manchmal versehentlich aktualisieren, müssen die MySQL-Instanzen der Online-Datenbank sql_safe_updates=1 festlegen, um Aktualisierungen und Löschungen ohne Indizes zu vermeiden.

Als Ergebnis stellte der Entwickler eines Tages fest, dass das folgende SQL nicht korrekt ausgeführt werden konnte:

Aktualisiere t1, setze col2=1, wobei key1 in (wähle col2 aus t2, wobei key2='ABcD');

Der Fehler lautet wie folgt:

FEHLER 1175 (HY000): Sie verwenden den abgesicherten Aktualisierungsmodus und haben versucht, eine Tabelle ohne WHERE zu aktualisieren, die eine KEY-Spalte verwendet

Mit anderen Worten: Es ist nicht möglich, die Where-Bedingung zu aktualisieren, wenn sie nicht indiziert ist. Nach einiger Suche stellte ich fest, dass dies tatsächlich nicht möglich ist. Auch wenn key1 und key2 die Indizes von t1 bzw. t2 sind, [kann ich sie nicht in Primärschlüssel ändern]. Beschreibung: Unterabfrage-Updates werden nicht unterstützt.

Ich habe gegoogelt und herausgefunden, dass jemand anderes diese Frage schon einmal gestellt hat. .

http://stackoverflow.com/questions/24314830/query-not-getting-executed-if-supplied-a-nested-sub-query

Endgültige Lösung:

1) Ändern Sie die Parameter auf Sitzungsebene: set sql_safe_updates=0; und führen Sie den Aktualisierungsvorgang aus. Terminal verlassen.

2) Programmverarbeitung: select col2 from t2 where key2='ABcD' , um Daten zu erhalten, durchlaufen Sie dann die Ergebnisse und verwenden Sie update t1 set col2=1 where key1=? Stapelweise aktualisiert. Es wird empfohlen, die Programmverarbeitung zu verwenden. Die vorübergehende Änderung von Variablen ist keine langfristige Lösung.

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Ausführliche Erläuterung der MySQL UPDATE-Anweisung
  • Detailliertes Beispiel für MySQL-Joint-Tabellen-Update-Daten
  • Beispielüberprüfung MySQL | Update-Feld mit demselben Wert zeichnet Binlog auf
  • Detaillierte Erläuterung des Ausführungsprozesses der MySQL-Update-Anweisung
  • Codebeispiele für MySQL-Batchoperationsanweisungen „Select“, „Insert“ und „Update“
  • Zusammenfassung der gemeinsamen Updatemethode für MySQL-Updates mehrerer Tabellen
  • Führt MySQL die Aktualisierungsanweisung erneut aus, wenn sie dieselben Daten enthält wie die ursprüngliche?
  • Erläuterung der MySQL-Transaktionsauswahl für die Aktualisierung und Datenkonsistenzverarbeitung
  • Mehrere Möglichkeiten zum Aktualisieren von Batches in MySQL
  • Fehlereinfügungsanalyse der Funktion „updatexml()“ von MySQL
  • So beheben Sie den Fehler 1093 - Sie können in der FROM-Klausel in MySQL keine Zieltabelle für die Aktualisierung angeben
  • Mybatis führt Batch-Update-Methode aus (Oracle, MySQL)
  • Notieren Sie eine Falle bei der Aktualisierung der MySQL-Update-Anweisung

<<:  So implementieren Sie das Strategiemuster in Javascript

>>:  Eine vollständige Anleitung zur Konfiguration von Linux-Umgebungsvariablen

Artikel empfehlen

Native JS-Implementierung des Ladefortschrittsbalkens

Dieser Artikel zeigt einen Spezialeffekt für dyna...

uniapp implementiert Datums- und Zeitauswahl

In diesem Artikelbeispiel wird der spezifische Co...

Der Unterschied und die Verwendung von json.stringify() und json.parse()

1. Unterschiede zwischen JSON.stringify() und JSO...

VUE realisiert Registrierungs- und Login-Effekte

In diesem Artikelbeispiel wird der spezifische Co...

So führen Sie py-Dateien direkt unter Linux aus

1. Erstellen Sie zuerst die Datei (wechseln Sie p...

Sehr empfehlenswert! Syntax Sugar in Vue 3.2 einrichten

Inhaltsverzeichnis Vorherige 1. Was ist Setup-Syn...

Keine chinesische Spezialität: Webentwicklung unter kulturellen Unterschieden

Webdesign und -entwicklung sind harte Arbeit, als...

Ein kurzer Vortrag über die Variablenförderung in JavaScript

Inhaltsverzeichnis Vorwort 1. Welche Variablen we...

Detaillierte Erklärung der MySQL-Grundoperationen (Teil 2)

Vorwort Dieser Artikel enthält 1. Mehrere wesentl...

So generieren Sie eine Vue-Benutzeroberfläche per Drag & Drop

Inhaltsverzeichnis Vorwort 1. Technisches Prinzip...

Vue-Komponente zur Realisierung einer Karussell-Animation

In diesem Artikelbeispiel wird der spezifische Co...

Einführung in den strikten Modus von JavaScript verwenden Sie strikt

Inhaltsverzeichnis 1. Übersicht 1.1 Was ist der s...

Detaillierte Erklärung der grundlegenden Typen von TypeScript

Inhaltsverzeichnis Boolescher Typ Nummerntypen Ze...