Wie MySQL implizite Standardwerte verarbeitet

Wie MySQL implizite Standardwerte verarbeitet

Einige Studenten sagten, dass sie auf das Problem der Inkonsistenz zwischen Master und Slave gestoßen seien.

Die allgemeine Situation ist, dass die Slave-Datenbank durch Exportieren und Importieren von Daten mithilfe von mysqldump erstellt wird. Nachdem die Erstellung erfolgreich war, wird bei der Verwendung von mysqldump zur Überprüfung, ob die Tabellenstruktur von Master und Slave konsistent ist, festgestellt, dass einige Tabellendefinitionen inkonsistent sind:

Aus den Vergleichsergebnissen können wir erkennen, dass auf der Slave-Seite den Definitionen von drei Spalten „default null“ hinzugefügt wird.

Ich vermutete, dass die Umgebung von jemandem verändert worden war, konnte jedoch schließlich bestätigen, dass die Umgebung nicht manipuliert worden war. Dann habe ich einen weiteren Test durchgeführt, bei dem ich mysqldump zum Exportieren der Daten und source zum Importieren der Daten in die Slave-Datenbank verwendet habe. Ich habe festgestellt, dass dieses Phänomen immer noch auftrat, und gefragt, ob der Befehl source einen Fehler enthielt!

Tatsächlich hängt dies damit zusammen, wie MySQL intern implizite Standardwerte verarbeitet.

Wenn ein Datentyp keinen expliziten Standardwert enthält, bestimmt MySQL den Standardwert gemäß den folgenden Regeln:
Wenn die Spalte NULL-Werte annehmen kann, wird der Spaltendefinition eine explizite Standard-NULL-Klausel hinzugefügt. Wenn die Spalte keine NULL-Werte annehmen kann, wird der Spaltendefinition keine explizite Standard-Klausel hinzugefügt.

Wenn Daten in eine NOT NULL -Spalte ohne explizite DEFAULT-Klausel eingegeben werden und eine INSERT - oder REPLACE-Anweisung keinen Wert für die Spalte enthält oder eine UPDATE-Anweisung die Spalte auf NULL setzt, behandelt MySQL die Spalte entsprechend dem geltenden SQL-Modus:
Wenn der strikte SQL-Modus aktiviert ist, tritt bei Transaktionstabellen ein Fehler auf und die Anweisung wird zurückgesetzt. Bei nicht transaktionalen Tabellen tritt ein Fehler auf. Tritt dieser Fehler jedoch in der zweiten oder einer nachfolgenden Zeile einer mehrzeiligen Anweisung auf, wurden alle Zeilen vor dem Fehler bereits eingefügt.
Wenn der strikte Modus nicht aktiviert ist, setzt MySQL die Spalte auf den impliziten Standardwert für den Spaltendatentyp.

Nehmen wir an, dass Tabelle t wie folgt definiert ist:

mysql> Tabelle erstellen t(i int ungleich null);

Hier hat i keinen expliziten Standardwert.
Im strikten SQL-Modus erzeugen die folgenden Anweisungen Fehler und die Einfügung schlägt fehl.

mysql> Variablen wie „%sql_mode%“ anzeigen;
+-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variablenname | Wert |
+-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| SQL-Modus | NUR_VOLLSTÄNDIGE_GROUP_BY, STRENGE_TRANS_TABLES, KEINE_NULL_IM_DATUM, KEIN_NULL_DATUM, FEHLER_FÜR_DIVISION_DURCH_NULL, KEIN_AUTOMATISCHES_ERSTELLEN_BENUTZER, KEIN_ENGINE_SUBSTITUTION |
+-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 Zeile im Satz (0,01 Sek.)

 mysql> INSERT INTO t VALUES();
FEHLER 1364 (HY000): Feld „i“ hat keinen Standardwert
mysql> IN t-WERTE EINFÜGEN (STANDARD);
FEHLER 1364 (HY000): Feld „i“ hat keinen Standardwert
mysql> IN t-WERTE EINFÜGEN (DEFAULT(i));
FEHLER 1364 (HY000): Feld „i“ hat keinen Standardwert
MySQL>

Im nicht strikten SQL-Modus:

mysql> SETZEN @@sql_mode='';
Abfrage OK, 0 Zeilen betroffen, 1 Warnung (0,00 Sek.)

 mysql> Variablen wie „%sql_mode%“ anzeigen;
+---------------+-------+
| Variablenname | Wert |
+---------------+-------+
| SQL-Modus | |
+---------------+-------+
1 Zeile im Satz (0,00 Sek.)

 mysql> INSERT INTO t VALUES();
Abfrage OK, 1 Zeile betroffen, 1 Warnung (0,00 Sek.)

 mysql> IN t-WERTE EINFÜGEN (STANDARD);
Abfrage OK, 1 Zeile betroffen, 1 Warnung (0,01 Sek.)

 mysql> IN t-WERTE EINFÜGEN (DEFAULT(i));
FEHLER 1364 (HY000): Feld „i“ hat keinen Standardwert
mysql> wähle * aus t;
+---+
| ich |
+---+
| 0 |
| 0 |
+---+
2 Zeilen im Satz (0,01 Sek.)

 MySQL>

Für eine bestimmte Tabelle zeigt die Anweisung SHOW CREATE TABLE an, welche Spalten eine explizite DEFAULT-Klausel haben. Die impliziten Standardwerte sind wie folgt definiert:
Bei numerischen Typen ist der Standardwert 0, bei Ganzzahl- oder Gleitkommatypen, die mit dem Attribut AUTO_INCREMENT deklariert sind, ist der Standardwert jedoch der nächste Wert in der Sequenz.
Für andere Datums- und Zeittypen als TIMESTAMP ist der Standardwert der Wert „Null“ für diesen Typ. Dasselbe gilt für TIMESTAMP, wenn die Systemvariable „explicit_defaults_for_timestamp“ aktiviert ist. Andernfalls wird für die erste TIMESTAMP-Spalte in der Tabelle standardmäßig das aktuelle Datum und die aktuelle Uhrzeit verwendet.
Für andere Zeichenfolgentypen als ENUM ist der Standardwert eine leere Zeichenfolge. Bei ENUM ist der Standardwert der erste Enumerationswert.

mysql> Tabelle erstellen t1(id int,name varchar(20));
Abfrage OK, 0 Zeilen betroffen (0,04 Sek.)

 mysql> anzeigen, Tabelle erstellen t1\G
*************************** 1. Reihe ***************************
       Tabelle: t1
Tabelle erstellen: CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(20) STANDARD NULL
) ENGINE=InnoDB STANDARD-CHARSET=utf8mb4
1 Zeile im Satz (0,00 Sek.)

 MySQL>

Oben finden Sie Einzelheiten dazu, wie MySQL implizite Standardwerte behandelt. Weitere Informationen zu impliziten MySQL-Standardwerten finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • So weisen Sie Feldern bei der MySQL-Abfrage Standardwerte zu
  • Detaillierte Erläuterung des Fehlerproblems beim Festlegen des Standardwerts 0000-00-00 in den Datums- und Datums-/Uhrzeittypen der MySQL-Datenbank
  • Die Fallstricke und Lösungen, die durch den Standardwert von sql_mode in MySQL 5.7 verursacht werden
  • So legen Sie den Standardwert für den Datums-/Uhrzeittyp in MySQL fest
  • In der MySQL-Befehlszeile ein Feld zur Tabelle hinzufügen (Feldname, ob es leer ist, Standardwert)
  • So legen Sie den Standardwert in der MySQL-Select-Anweisung fest
  • Analysieren Sie die Methode zum Festlegen der aktuellen Zeit als Standardwert in MySQL
  • MySQL-Tabellenfeld-Standardwert festlegen (grafisches Tutorial und auf Details achten)
  • „Implizite Konvertierung“ von MySQL 5.6 führt zu Indexfehlern und ungenauen Daten
  • Beheben von Problemen mit impliziter MySQL-Konvertierung
  • Zusammenfassung der impliziten Typkonvertierung von MySQL

<<:  Analyse des Consul-Konfigurationsprozesses für die Docker-Bereitstellung

>>:  innerHTML-Anwendung

Artikel empfehlen

JS realisiert die Kartenausgabe-Animation

In diesem Artikelbeispiel wird der spezifische JS...

JavaScript implementiert den detaillierten Prozess der Stapelstruktur

Inhaltsverzeichnis 1. Die Stapelstruktur verstehe...

Manjaro-Installation CUDA-Implementierungs-Tutorial-Analyse

Ende letzten Jahres habe ich im Dualsystem meines...

Inaktive Benutzer nach einem Login-Timeout in Linux automatisch abmelden

Methode 1: Ändern Sie die Datei .bashrc oder .bas...

MySQL-Abfrageoptimierung: Eine Tabellenoptimierungslösung für 1 Million Daten

1. Abfragegeschwindigkeit von zwei Abfrage-Engine...

Welcher Befehl eignet sich besser für die unscharfe Suche nach Dateien in Linux?

1. Einleitung In diesem Artikel wird hauptsächlic...

So installieren Sie MySQL 5.7 unter Windows

Laden Sie zuerst die komprimierte Version von MyS...

HTML+CSS zum Erstellen einer Schaltfläche im Cyberpunk-Stil

Erster Blick auf die Wirkung: Vorwort: Auf diese ...

Vuex implementiert einen einfachen Einkaufswagen

In diesem Artikelbeispiel wird der spezifische Co...

Einführung in die Verwendung von Alt- und Titelattributen von HTML-Img-Tags

Wenn Browser-Anbieter die Standards umgehen und ei...