Detaillierte Erklärung zu Unique Constraints und NULL in MySQL

Detaillierte Erklärung zu Unique Constraints und NULL in MySQL

Vorwort

Eine Anforderung, die ich zuvor zur Vereinfachung der Beschreibung gestellt hatte, besteht darin, MQ-Nachrichten von anderen Gruppen zu empfangen und dann einen Datensatz in die Datenbank einzufügen. Um das wiederholte Senden von Nachrichten und das Einfügen mehrerer doppelter Datensätze zu verhindern, wird mehreren Spalten in der Tabelle ein eindeutiger Index hinzugefügt.

ERSTELLEN SIE EINEN EINZIGARTIGEN INDEX IDX_UN_LOAN_PLAN_APP FÜR testTable (A, B, C);

Derzeit erlauben die Spalten A, B und C keine NULL-Werte und die Eindeutigkeitsbeschränkung funktioniert auch.

Später wurde aufgrund geänderter Anforderungen die vorherige Eindeutigkeitsbeschränkung geändert und eine weitere Spalte hinzugefügt. (Ich werde nicht näher darauf eingehen, warum es hinzugefügt wurde).

ALTER TABLE testTable
DROP INDEX IDX_UN_LOAN_PLAN_APP,
EINDEUTIGEN SCHLÜSSEL `IDX_UN_LOAN_PLAN_APP` HINZUFÜGEN (A, B, C, D);

Das neu hinzugefügte D ist vom Typ datetime, lässt NULL zu und hat einen Standardwert von NULL. Der Grund, warum der Standardwert NULL ist, besteht darin, dass nicht alle Datensätze diese Zeit haben. Wenn ein magischer Wert (wie „1970-01-01 08:00:00“) zwangsweise als Standardwert festgelegt wird, sieht das seltsam aus.

Blaue Königin. . . Dann geht etwas schief. Nach dem Hinzufügen von D ist die Eindeutigkeitsbeschränkung grundsätzlich ungültig.

In Testtabelle einfügen (A,B,C,D) VALUES (1,2,3,NULL); --- OK
In Testtabelle einfügen (A,B,C,D) VALUES (1,2,3,NULL); --- OK
In Testtabelle einfügen (A,B,C,D) VALUES (1,2,3,NULL); --- OK

Die obigen drei SQL-Anweisungen können alle erfolgreich ausgeführt werden und es entstehen mehrere identische Datensätze in der Datenbank. Gemäß unserer bisherigen Idee sollte bei der Ausführung der letzten beiden SQL-Anweisungen eine Ausnahme vom Typ „Doppelter Schlüssel“ ausgelöst werden.

Später habe ich nachgesehen und festgestellt, dass dieser Punkt in der offiziellen MySQL-Dokumentation bereits klar dargelegt wurde. Eindeutige Indizes erlauben die Existenz mehrerer NULL-Werte:

Ein UNIQUE-Index erstellt eine Einschränkung, sodass alle Werte im Index unterschiedlich sein müssen. Ein Fehler tritt auf, wenn Sie versuchen, eine neue Zeile mit einem Schlüsselwert hinzuzufügen, der mit einer vorhandenen Zeile übereinstimmt. Für alle Engines erlaubt ein UNIQUE-Index mehrere NULL-Werte für Spalten, die NULL enthalten können.

Aus der folgenden Tabelle ist außerdem ersichtlich, dass beim Erstellen eines eindeutigen Schlüssels mehrere NULL-Werte zulässig sind, unabhängig davon, welche Art von Speicher-Engine verwendet wird. . . .

Wenn man darüber nachdenkt, ist das eigentlich ganz vernünftig. Schließlich steht NULL in MySQL für "unbekannt". In SQL gibt jeder mit NULL verglichene Wert NULL statt TRUE zurück, sogar ein Vergleich von NULL und NULL gibt NULL zurück.

Die einzige Lösung besteht also darin, das Problem zu beheben. . . Die Lösung ist ziemlich einfach und grob. Ich habe einfach die Online-Daten aktualisiert, „1970-01-01 08:00:00“ als Standardwert festgelegt und dann die Spalte so geändert, dass NULL nicht zulässig ist. Ähm.

Viele Leute haben dieses Problem auf der offiziellen MySQL-Website diskutiert. Einige Leute denken, es sei ein MySQL-Fehler, während andere denken, es sei eine Funktion. Anbei der Link.

MySQL-Fehler: #8173: Eindeutiger Index erlaubt Duplikate mit Nullwerten

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels Ihnen bei Ihrem Studium oder Ihrer Arbeit helfen kann. 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:
  • Detaillierte Erklärung zum Schreiben von MySQL ungleich null und gleich null
  • Mysql NULL verursachte die Grube
  • Detaillierte Erklärung zur Verwendung von NULL und NOT NULL beim Erstellen von Tabellen in MySQL
  • Zusammenfassung der Wissenspunkte im Zusammenhang mit Null (IFNULL, COALESCE und NULLIF) in MySQL
  • Lösung für das Problem der Nullspalte in der NOT IN-Füllgrube in MySQL
  • Instanzmethode für MySQL-String-Verkettung und Festlegen von Nullwerten
  • Ausführliche Erläuterung der Auswirkungen von NULL auf Indizes in MySQL
  • Sollten nullbare Felder in MySQL auf NULL oder NOT NULL gesetzt werden?
  • Detaillierte Erklärung der Funktionen IFNULL() und COALESCE() zum Ersetzen von Null in MySQL
  • MySQL NULL-Datenkonvertierungsmethode (unbedingt lesen)
  • Unterscheiden Sie zwischen Nullwert und leerem Zeichen ('''') in MySQL

<<:  Kalendereffekt basierend auf jQuery

>>:  So erstellen, speichern und laden Sie Docker-Images

Artikel empfehlen

JS realisiert den Effekt des Bildwasserfallflusses

In diesem Artikel wird der spezifische JS-Code zu...

Analyse des Problems des Datenverlusts durch erzwungene Aktualisierung von Vuex

vuex-persistenter Zustand Kernprinzip: Alle Vuex-...

Detaillierte Erklärung des Abstandsproblems zwischen IMG-Tags

Grundlegende Analyse des IMG-Tags: In HTML5 beste...

Hinweise zur Verwendung von $refs in Vue-Instanzen

Während des Entwicklungsprozesses verwenden wir h...

Umfassendes Verständnis des html.css-Überlaufs

Umfassendes Verständnis des html.css-Überlaufs XM...

Detaillierte Erklärung und Zusammenfassung der URL zur Datenbankverbindung

Detaillierte Erklärung und Zusammenfassung der UR...

Unterschiede und Vergleiche von Speicher-Engines in MySQL

MyISAM-Speicher-Engine MyISAM basiert auf der ISA...

5 Möglichkeiten zur Migration von MySQL zu ClickHouse

Die Datenmigration muss von MySQL nach ClickHouse...

CSS3 verwendet var()- und calc()-Funktionen, um Animationseffekte zu erzielen

Wissenspunkte in der Vorschau anzeigen. Animation...

Eine kurze Diskussion über benutzerdefinierte VUE-Uni-App-Komponenten

1. Übergeordnete Komponenten können Daten über Re...