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

So ermitteln Sie, ob das Linux-System auf VMware installiert ist

Wie kann festgestellt werden, ob das aktuelle Lin...

Detaillierte Einführung und Verwendungsbeispiele für Map-Tag-Parameter

Karten-Tags müssen paarweise vorkommen, d. h. <...

Grafisches Tutorial zur Installation und Konfiguration von mysql5.7.20 (Mac)

Grafisches Tutorial zur Installation und Konfigur...

Detaillierte Erläuterung der gespeicherten Prozedur „MySql View Trigger“

Sicht: Wenn eine temporäre Tabelle wiederholt ver...

Häufige Browserkompatibilitätsprobleme (Zusammenfassung)

Browserkompatibilität ist nichts anderes als Stil...

Zusammenfassung einiger kleinerer Probleme mit der MySQL-Autoinkrement-ID

Die folgenden Fragen basieren alle auf der InnoDB...

Implementierungscode für die adaptive IFrame-Größe

Seitendomänenbeziehung: Die Hauptseite a.html gehö...

Einführung in mögliche Probleme nach der Installation von Tomcat

1. Der Tomcat-Dienst ist nicht geöffnet Geben Sie...

Installieren Sie Redis und MySQL auf CentOS

1|0MySQL (MariaDB) 1|11. Beschreibung Das Datenba...

Gründe, warum MySQL-Abfragen langsam sind

Inhaltsverzeichnis 1. Wo ist die Langsamkeit? 2. ...

Rastersysteme im Webdesign

Bildung des Gittersystems Im Jahr 1692 war der fr...