MySQL-Primärschlüssel-Benennungsstrategie im Zusammenhang

MySQL-Primärschlüssel-Benennungsstrategie im Zusammenhang

Als ich kürzlich die Details der Datenlebenszyklusverwaltung klärte, stieß ich auf ein kleines Problem. Die Benennungsstrategie für Primärschlüssel von MySQL scheint jede Form der benutzerdefinierten Benennung zu ignorieren.

Dies bedeutet, dass der Primärschlüssel, wenn Sie ihn als idx_pk_id benennen, in MySQL als PRIMARY behandelt wird.

Selbstverständlich können wir auf dieser Basis noch einige Erweiterungen und Ergänzungen vornehmen.

Lassen Sie uns zunächst das Problem reproduzieren. Wir verbinden uns mit der Datenbank test und erstellen die Tabelle test_data2.

mysql> Test verwenden

mysql> Tabelle test_data2 erstellen (ID int, Name varchar(30));

Abfrage OK, 0 Zeilen betroffen (0,05 Sek.)

Erstellen Sie als Nächstes einen Primärschlüssel und nennen Sie ihn idx_pk_id. Aus der Ausführungssituation heraus verarbeitet MySQL ihn normal.

mysql> Tabelle ändern test_data2 Primärschlüssel hinzufügen idx_pk_id(id);
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

Zum weiteren Vergleich fügen wir einen eindeutigen Index (Sekundärindex) hinzu, um den Unterschied anzuzeigen.

mysql> Tabelle ändern, test_data2, eindeutigen Schlüssel hinzufügen, idx_uniq_name(Name);
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
Datensätze: 0 Duplikate: 0 Warnungen: 0

Methode 1 zur Benennung von Primärschlüsseln anzeigen: Verwenden Sie den Befehl „show indexes“

Um MySQL-Indexinformationen anzuzeigen, verwenden Sie „show indexes from test_data2“.

mysql> Indizes von test_data2\G anzeigen
*************************** 1. Reihe ***************************
    Tabelle: test_data2
  Nicht eindeutig: 0
   Schlüsselname: PRIMARY
 Seq_in_index: 1
 Spaltenname: id
  Sortierung: A
 Kardinalität: 0
   Unterteil: NULL
    Gepackt: NULL
     Null: 
  Indextyp: BTREE
   Kommentar: 
Index_Kommentar: 
*************************** 2. Reihe ***************************
    Tabelle: test_data2
  Nicht eindeutig: 0
   Schlüsselname: idx_uniq_name
 Seq_in_index: 1
 Spaltenname: Name
  Sortierung: A
 Kardinalität: 0
   Unterteil: NULL
    Gepackt: NULL
     Null: JA
  Indextyp: BTREE
   Kommentar: 
Index_Kommentar: 
2 Zeilen im Satz (0,00 Sek.)

Methode 2 zur Benennung von Primärschlüsseln anzeigen: Datenwörterbuch „information_schema.statistics“ verwenden

Die Befehlsmethode ist nicht allgemein genug. Wir können das Datenwörterbuch information_schema.statistics verwenden, um Daten zu extrahieren.

mysql> wähle * aus information_schema.statistics, wobei table_schema='test' und table_name='test_data2' limit 20 \G        
*************************** 1. Reihe ***************************
TABLE_CATALOG: def
 TABLE_SCHEMA: Test
  TABELLENAME: test_data2
  NICHT_EINDEUTIG: 0
 INDEX_SCHEMA: Test
  INDEX_NAME: PRIMARY
 SEQ_IN_INDEX: 1
 COLUMN_NAME: ID
  KOLLATION: A
 KARDINALITÄT: 0
   SUB_PART: NULL
    VERPACKT: NULL
   NULL-Werte zulässig: 
  INDEX_TYPE: BTREE
   KOMMENTAR: 
INDEX_COMMENT: 
*************************** 2. Reihe ***************************
TABLE_CATALOG: def
 TABLE_SCHEMA: Test
  TABELLENAME: test_data2
  NICHT_EINDEUTIG: 0
 INDEX_SCHEMA: Test
  INDEX_NAME: idx_uniq_name
 SEQ_IN_INDEX: 1
 COLUMN_NAME: Name
  KOLLATION: A
 KARDINALITÄT: 0
   SUB_PART: NULL
    VERPACKT: NULL
   NULL-Werte zulässig: JA
  INDEX_TYPE: BTREE
   KOMMENTAR: 
INDEX_COMMENT: 
2 Zeilen im Satz (0,00 Sek.)

Methode 3 zum Anzeigen der Benennung von Primärschlüsseln: Verwenden Sie den Befehl „show create table“

Wenn Sie die Anweisung zur Tabellenerstellung anzeigen, werden Sie feststellen, dass der Primärschlüsselname herausgefiltert wurde.

mysql> anzeigen, erstellen, Tabelle test_data2\G
*************************** 1. Reihe ***************************
    Tabelle: test_data2
Tabelle erstellen: CREATE TABLE `test_data2` (
 `id` int(11) NICHT NULL,
 `name` varchar(30) DEFAULT NULL,
 Primärschlüssel (`id`),
 EINZIGARTIGER SCHLÜSSEL `idx_uniq_name` (`name`)
) ENGINE=InnoDB STANDARD-CHARSET=utf8
1 Zeile im Satz (0,00 Sek.)
Einige Studenten fragen sich vielleicht, ob die Verarbeitungsmethoden unterschiedlich sind, weil die Anweisungen „create“ und „alter“ separat ausgeführt werden. Wir können dies in einem Schritt tun und den Namen des Primärschlüssels in der Anweisung „create“ deklarieren.
CREATE TABLE `test_data3` (
 `id` int(11) NICHT NULL,
 `name` varchar(30) DEFAULT NULL,
 PRIMÄRSCHLÜSSEL idx_pk_id(`id`),
 EINZIGARTIGER SCHLÜSSEL `idx_uniq_name` (`name`)
)ENGINE=InnoDB STANDARD-CHARSET=utf8;

Wenn Sie zu diesem Zeitpunkt die Anweisung zur Tabellenerstellung überprüfen, werden Sie feststellen, dass das Ergebnis dasselbe wie oben ist und der Primärschlüsselname PRIMARY lautet.

mysql> anzeigen, erstellen, Tabelle test_data3\G    
*************************** 1. Reihe ***************************
    Tabelle: test_data3
Tabelle erstellen: CREATE TABLE `test_data3` (
 `id` int(11) NICHT NULL,
 `name` varchar(30) DEFAULT NULL,
 Primärschlüssel (`id`),
 EINZIGARTIGER SCHLÜSSEL `idx_uniq_name` (`name`)
) ENGINE=InnoDB STANDARD-CHARSET=utf8
1 Zeile im Satz (0,00 Sek.)

Methode 4 zur Benennung von Primärschlüsseln anzeigen: Benennung von Einschränkungen anzeigen

Natürlich gibt es noch viele andere Möglichkeiten zur Überprüfung. Wenn wir beispielsweise Einschränkungen verwenden, um den Primärschlüssel zu benennen, lautet der Primärschlüsselname, den wir erhalten, PRIMARY.

Tabelle erstellen, wenn nicht vorhanden `default_test` (
 `default_test`.`id` SMALLINT NICHT NULL AUTO_INCREMENT,
 `default_test`.`name` LONGTEXT NICHT NULL,
EINSCHRÄNKUNG `pk_id` PRIMÄRSCHLÜSSEL (`id`)
);

Methode 5 zur Benennung von Primärschlüsseln anzeigen: DML-Fehlerinformationen verwenden

Natürlich gibt es noch viele andere Möglichkeiten zur Überprüfung, beispielsweise die Verwendung von DML-Anweisungen.

mysql> in test_data2 Werte (1, 'aa') einfügen;
Abfrage OK, 1 Zeile betroffen (0,02 Sek.)
mysql> in test_data2 Werte (1, 'aa') einfügen;
FEHLER 1062 (23000): Doppelter Eintrag „1“ für Schlüssel „PRIMARY“

Die oben genannten Methoden können uns ein tieferes Verständnis dieses Details verschaffen, und wir können natürlich noch tiefer gehen.

Primärschlüssel-Benennungsmethode 6 anzeigen: offizielle Dokumentation

Diese Information steht tatsächlich in der offiziellen Dokumentation, sie ist aber nicht sehr offensichtlich.

Die Beschreibung des Primärschlüssels lautet wie folgt. Es gibt eine spezielle Anweisung, dass der Primärschlüssel PRIMARY heißt.

  • Eine Tabelle kann nur einen PRIMÄRSCHLÜSSEL haben.
  • Der Name eines PRIMARY KEY ist immer PRIMARY und kann daher nicht als Name für einen anderen Indextyp verwendet werden.
  • Wenn Sie keinen PRIMARY KEY haben und Ihre Anwendung die Angabe eines PRIMARY KEY in einer Tabelle erfordert, gibt MySQL den ersten UNIQUE-Index zurück, der keine NULL-Spalten als PRIMARY KEY hat.
  • Halten Sie in InnoDB-Tabellen den PRIMARY KEY kurz, um den Speicheraufwand sekundärer Indizes zu minimieren. Jeder sekundäre Indexeintrag enthält eine Kopie der Primärschlüsselspalten für die entsprechende Zeile.
  • Platzieren Sie in der erstellten Tabelle zuerst einen PRIMARY KEY, dann alle UNIQUE-Indizes und dann die nicht eindeutigen Indizes. Dies hilft dem MySQL-Optimierer bei der Priorisierung der zu verwendenden Indizes und erkennt doppelte UNIQUE-Schlüssel schneller.

Methode 7 zur Benennung von Primärschlüsseln anzeigen: Quellcode

Der Name des Primärschlüssels ist in sql_table.cc definiert.

const char *primary_key_name="PRIMARY";

Wenn wir diesem Pfad folgen, können wir einige logische Situationen bei der Implementierung verschiedener Ebenen erkennen.

Zusammenfassung:

Durch diese Methoden haben wir ein allgemeines Verständnis für die Benennung von Primärschlüsseln. Warum heißt PRIMARY so? Ich habe ein paar Punkte zusammengefasst:

1) Eine einheitliche Benennung kann als Standard verstanden werden

2) Er kann von einem eindeutigen Index unterschieden werden. Wenn beispielsweise ein eindeutiger Index nicht leer ist, sind die Eigenschaften sehr ähnlich und können durch Benennung des Primärschlüssels unterschieden werden. Sie sind auch in einigen Funktionen und Indexverwendungsszenarien leicht zu unterscheiden.

3) Der Primärschlüssel ist die erste Position eines Tabellenindex. Eine einheitliche Benennung kann logische Urteile klarer machen, einschließlich Szenarien, in denen Felder zu Primärschlüsseln usw. aktualisiert werden.

4) Es wird auch die Verarbeitung durch den Optimierer erleichtern und die Priorität des MySQL-Optimierers bei der Bestimmung des zu verwendenden Indexes erhöhen.

Oben finden Sie Einzelheiten zur MySQL-Primärschlüssel-Benennungsstrategie. Weitere Informationen zur MySQL-Primärschlüssel-Benennungsstrategie finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Ausführliche Diskussion über die automatische Inkrementierung von Primärschlüsseln in MySQL
  • Der Unterschied sowie die Vor- und Nachteile des MySQL-Primärschlüssels UUID und des automatisch inkrementierten Primärschlüssels
  • Was tun, wenn der Auto-Increment-Primärschlüssel in MySQL aufgebraucht ist?
  • Lösung für das Ausgehen der Auto-Increment-ID (Primärschlüssel) von MySQL
  • Detaillierte Analyse, warum MySQL die Verwendung von UUID oder Snowflake-ID als Primärschlüssel nicht empfiehlt
  • Detaillierte Erläuterung der Überwachung von Spaltenüberläufen ohne Primärschlüssel in MySQL-Tabellen
  • Verwenden Sie Prometheus, um den verbleibenden verfügbaren Prozentsatz der MySQL-Autoinkrement-Primärschlüssel zu zählen
  • Mysql SQL-Anweisungsvorgang zum Hinzufügen oder Ändern des Primärschlüssels

<<:  Reflexion und Proxy in Front-End-JavaScript

>>:  CSS-Implementierungscode für verzerrte Schatten

Artikel empfehlen

30 Minuten, um Ihnen ein umfassendes Verständnis von React Hooks zu vermitteln

Inhaltsverzeichnis Überblick 1. useState 1.1 Drei...

Zusammenfassung zur Verwendung des MySQL-Autorisierungsbefehls „grant“

So verwenden Sie den MySQL-Autorisierungsbefehl „...

Regeln für die Gestaltung des Anmeldeformulars

Ich habe „Patterns for Sign Up & Ramp Up“ vor ...

Rsync+crontab regelmäßige Synchronisierungssicherung unter centos7

In letzter Zeit möchte ich regelmäßig wichtige in...

Zusammenfassung der Tipps zum Erstellen von Webseiten

Vorwort Dieser Artikel fasst hauptsächlich einige...

Benutzerzentriertes Design

Ich wurde in letzter Zeit häufig zu einer offensi...

Das Laufschrift-Tag in HTML erzielt einen nahtlosen Laufschrift-Effekt

Das <marquee>-Tag ist ein Tag, das paarweis...

Die konkrete Umsetzung des JavaScript-exklusiven Denkens

Im vorherigen Blog hat Xiao Xiong die Methoden ve...

Eine kurze Erläuterung der Situationen in MySQL, die zu Indexfehlern führen

Hier einige Tipps von Ausbildungsstätten und mein...

Verwendung und Ausführungsprozess des HTTP-Moduls im Knoten

Welche Rolle spielt http im Knoten? Die Aufgabe d...

HTML löst das Problem ungültiger Tabellenbreiteneinstellungen

Wenn Sie den Stil „table-layer:fixed“ für eine Ta...

js Implementierung des Verifizierungscode-Falls

In diesem Artikelbeispiel wird der spezifische Co...