2. Primärschlüssel und eindeutiger Schlüssel
1) Der Ausgangspunkt /function ist anders: Ersteres ist die eindeutige Kennung einer Datenzeile, während letzteres nur zur Vermeidung von Datenduplizierungen verwendet wird.
2) Eine oder mehrere Spalten des ersteren dürfen alle nicht null sein. Wenn eine der Spalten null ist, wird sie beim Hinzufügen des Primärschlüssels nicht null wird sich wieder ändern. Die letzte Spalte kann null sein.
3) Eine Tabelle kann nur einen Primärschlüssel und mehrere eindeutige Schlüssel haben. [Kann eine Tabelle keinen Primärschlüssel haben? ? ? 】
4) Für die Spalte, die dem eindeutigen Schlüssel entspricht, kann null mehrmals eingefügt werden (obwohl dies auch eine Art Wiederholung ist); .
Tabelle erstellen t(id int, key kismet(id)); Geben Sie den Namen des Schlüssels anEinschränkung: kann nicht verwendet werden, Schließlich ist es normal. Der Schlüssel hat keine Einschränkungswirkung(2) Primärschlüssel
create table t(id int, unique key (id)); Die Benennungsregeln unterscheiden sich von key. Nur die erste Spalte wird als Schlüsselname verwendetTabelle erstellen t(id int, Primärschlüssel kismet(id )); kann ausgeführt werden, aber der Name funktioniert nicht , aber der Name funktioniert nicht(3) eindeutiger Schlüssel
create table t(id int, Foreign Key Kismet(dage_id) references dage(id)); kann ausgeführt werden, und das Ausführungsergebnis ist ein automatisch benannter Fremdschlüssel und einen normalen Schlüssel namens Kismet.create table t(id int, Einschränkung Kismet Unique Key(id)); Geben Sie den Namen des Schlüssels an(4) Fremdschlüssel [Ich persönlich denke das Die sogenannte Erstellung von zwei Schlüsseln besteht aus zwei Ebenen der Logik, nämlich Datenintegritätseinschränkungen und Indexoptimierung key (dage_id) verweist auf dage(id)); kann ausgeführt werden, und das Ausführungsergebnis ist ein automatisch benannter Fremdschlüssel und ein automatisch benannter gewöhnlicher Schlüssel.
(5) Index: Der Schlüssel im Schlüssel und der eindeutige Schlüssel (Tabellenebene) können in den Index übertragen werden, und der Effekt ist das gleiche.3. Nach der Erstellung(1) Schlüssel hinzufügen: hinzufügen, zum Beispiel: Tabelle ändern, um Primärschlüssel hinzuzufügen(2) Schlüssel löschen, löschen, Primärschlüssel Verwenden Sie alter table, um den Primärschlüssel zu löschen. Beachten Sie den Unterschied zwischen dem Löschen von Schlüsseln und dem Löschen von Spalten.4. Informationen anzeigen: Tabellenname anzeigen; Sie können verschiedene Attribute der Tabelle anzeigen, einschließlich Schlüsselattribute, Speicher-Engine, Zeichensatz, Partitionsstatus usw.3. Fremdschlüssel1. Es kann zwei Tabellen zuordnen, um die Datenkonsistenz sicherzustellen und einige zu implementieren Kaskadenoperationen;2. Speicher-Engine, die Fremdschlüssel unterstützt: InnoDB, Speicherüberprüfungsunterstützung, andere wurden nicht überprüft.3. Vollständige Syntax(1) [CONSTRAINT-Symbol] FOREIGN KEY [id] (index_col_name, ...) REFERENCES tbl_name (index_col_name, ...)[Beim Löschen {RESTRICT |. Keine Aktion festlegen}][Beim Aktualisieren {RESTRICT | >(2) Verwendung: Diese Syntax kann beim Erstellen einer Tabelle und einer Änderungstabelle verwendet werden. (3) CONSTRAINT-Symbol gibt den Namen des Schlüssels an. Wenn nicht angegeben, wird verwendet werden beim Löschen und beim Aktualisieren automatisch generiert (4) und stellen ereignisauslösende Einstellungen dar. Parameter können eingestellt werden:RESTRICT (Fremdschlüsseländerungen im Erscheinungsbild einschränken, Standard). )CASCADE (Fremdschlüsseländerungen folgen)SET NULL (Nullwert festlegen )STANDARD EINSTELLENKEINE AKTION(1) Erstellen Sie eine Tabelle, legen Sie Fremdschlüssel fest und fügen Sie Daten ein4. Beispiel<span class="pln">CREATE TABLE <span class="str">`dage`<span class="pln"> <span class="pun">(</span></span></span></span>
<span class="pln"> <span class="str">`id`<span class="pln"> <span class="kwd">int<span class="pun">(<span class="lit">11<span class="pun">)<span class="pln"> NOT NULL auto_increment<span class="pun">,</span></span></span></span></span></span></span></span></span>
<span class="pln"> <span class="str">`name`<span class="pln"> varchar<span class="pun">(<span class="lit">32<span class="pun">)<span class="pln"> <span class="kwd">default<span class="pln"> <span class="str">''<span class="pun">,</span></span></span></span></span></span></span></span></span></span></span>
<span class="pln"> PRIMARY KEY <span class="pun">(<span class="str">`id`<span class="pun">)</span></span></span></span>
<span class="pun">);</span>
<span class="pln">CREATE TABLE <span class="str">`xiaodi`<span class="pln"> <span class="pun">(</span></span></span></span>
<span class="pln"> <span class="str">`id`<span class="pln"> <span class="kwd">int<span class="pun">(<span class="lit">11<span class="pun">)<span class="pln"> NOT NULL auto_increment<span class="pun">,</span></span></span></span></span></span></span></span></span>
<span class="pln"> <span class="str">`dage_id`<span class="pln"> <span class="kwd">int<span class="pun">(<span class="lit">11<span class="pun">)<span class="pln"> <span class="kwd">default<span class="pln"> NULL<span class="pun">,</span></span></span></span></span></span></span></span></span></span></span>
<span class="pln"> <span class="str">`name`<span class="pln"> varchar<span class="pun">(<span class="lit">32<span class="pun">)<span class="pln"> <span class="kwd">default<span class="pln"> <span class="str">''<span class="pun">,</span></span></span></span></span></span></span></span></span></span></span>
<span class="pln"> CONSTRAINT <span class="str">`xiaodi_ibfk_1`<span class="pln"> FOREIGN KEY <span class="pun">(<span class="str">`dage_id`<span class="pun">)<span class="pln"> REFERENCES <span class="str">`dage`<span class="pln"> <span class="pun">(<span class="str">`id`<span class="pun">)</span></span></span></span></span></span></span></span></span></span></span></span>
<span class="pun">);</span>
insert into dage(name) values('铜锣湾'<span class="pun">);</span>
insert into xiaodi(dage_id,name) values(1,'铜锣湾_小弟A'<span class="pun">);</span>
(2) Wenn in Wenn es einen jüngeren Bruder gibt, löschen Sie den älteren Bruder. Das Ergebnis ist wie folgt:(3) Wenn Sie den jüngeren Bruder erzwingen möchten, ohne den älteren Bruder festzulegen, ist das Ergebnis wie folgt.(4) Ändern Sie die Ereignisauslösereinstellungen<span class="pun">[<span class="pln">SQL<span class="pun">]<span class="pln"> <span class="kwd">delete<span class="pln"> <span class="kwd">from<span class="pln"> dage <span class="kwd">where<span class="pln"> id<span class="pun">=<span class="lit">1<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span></span>
<span class="pun">[<span class="typ">Err<span class="pun">]<span class="pln"> <span class="lit">1451<span class="pln"> <span class="pun">-<span class="pln"> <span class="typ">Cannot<span class="pln"> <span class="kwd">delete<span class="pln"> <span class="kwd">or<span class="pln"> update a parent row<span class="pun">:<span class="pln"> a foreign key constraint fails <span class="pun">(<span class="str">`sample`<span class="pun">.<span class="str">`xiaodi`<span class="pun">,<span class="pln"> CONSTRAINT <span class="str">`xiaodi_ibfk_1`<span class="pln"> FOREIGN KEY <span class="pun">(<span class="str">`dage_id`<span class="pun">)<span class="pln"> REFERENCES <span class="str">`dage`<span class="pln"> <span class="pun">(<span class="str">`id`<span class="pun">))</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
[SQL] insert into xiaodi(dage_id,name) values(2,'旺角_小弟A'<span class="pun">);</span>
<span class="pln">alter table xiaodi drop foreign key xiaodi_ibfk_1<span class="pun">;</span></span>
<span class="pln">alter table xiaodi add foreign key<span class="pun">(<span class="pln">dage_id<span class="pun">)<span class="pln"> references dage<span class="pun">(<span class="pln">id<span class="pun">)<span class="pln"> on <span class="kwd">delete<span class="pln"> cascade on update cascade<span class="pun">;</span></span></span></span></span></span></span></span></span></span></span></span>
(5) Wenn Sie den ältesten Bruder löschen, obwohl noch ein jüngerer Bruder vorhanden ist: der älteste Bruder und der jüngere Der dem älteren Bruder entsprechende Bruder wird zusammen gelöscht. Wenn Sie den jüngeren Bruder zwangsweise einfügen möchten, ohne den älteren Bruder festzulegen, ändert sich das Ergebnis nicht, das heißt, es schlägt fehl.4. Index [Referenz:]1 >(1) Rolle: Indizes haben einen entscheidenden Einfluss auf die Abfragegeschwindigkeit. Wenn kein Index vorhanden ist, durchsucht die Abfrage die gesamte Tabelle. Wenn ein Index vorhanden ist, durchsucht die Abfrage nur den Index. Da sich die Daten der Datenbank nicht im Speicher befinden, muss jede Abfrage die Daten von der Festplatte in den Speicher übertragen, und E/A verschwendet viel Zeit. Da Indizes viel kleiner sind als Daten, kann die Verwendung von Indizes die Abfragegeschwindigkeit erheblich verbessern, insbesondere wenn die Datenmenge groß ist.(2) Der Index wird in der Speicher-Engine implementiert, nicht in der Serverschicht. Daher sind die Indizes der einzelnen Speicher-Engines nicht unbedingt genau gleich und nicht alle Speicher-Engines unterstützen alle Indextypen. Die derzeit am häufigsten verwendete Speicher-Engine ist InnoDB.2. Wählen Sie den Datentyp des Index aus: MySQL unterstützt viele Datentypen, und die Auswahl des geeigneten Datentyps zum Speichern von Daten hat große Auswirkungen auf die Leistung. Im Allgemeinen können einige Richtlinien befolgt werden [(1)(2) gilt nicht für Hash-Indizes]: (1) Kleinere Datentypen sind normalerweise besser: Kleinere Datentypen sind normalerweise besser. Benötigt weniger Speicherplatz auf der Festplatte , Arbeitsspeicher und CPU-Cache und Prozesse schneller.(1) Übersicht: Der gespeicherte Wert im Index ist wie folgt Die Reihenfolge in der Indexspalte. Sie können den B-Tree-Index verwenden, um vollständige Schlüsselwort-, Schlüsselwortbereichs- und Schlüsselwortpräfixabfragen durchzuführen.(2) Einfache Datentypen sind besser: Ganzzahlige Daten haben weniger Verarbeitungsaufwand als Zeichen, da der Vergleich von Zeichenfolgen komplexer ist. In MySQL sollten Sie zum Speichern der Zeit die integrierten Datums- und Uhrzeitdatentypen anstelle von Zeichenfolgen verwenden und zum Speichern von IP-Adressen ganzzahlige Datentypen verwenden.Beachten Sie, dass Sie für Indizes keine Zeichenfolgen verwenden sollten, wenn Sie Ganzzahlen verwenden können, insbesondere wenn die Datenmenge groß ist. Ein Nachteil von Ganzzahlen besteht darin, dass die Zusammenarbeit mit dem Client möglicherweise etwas mehr Arbeit erfordert (insbesondere bei großen Ganzzahlen). , hat aber kaum Auswirkungen auf die Effizienz.(3) Versuchen Sie NULL zu vermeiden: Spalten sollten als NOT NULL angegeben werden, es sei denn, Sie möchten NULL speichern. In MySQL ist es schwierig, Abfragen für Spalten mit Nullwerten zu optimieren, da sie Indizes, Indexstatistiken und Vergleichsvorgänge erschweren. Sie sollten Nullwerte durch 0, einen Sonderwert oder eine leere Zeichenfolge ersetzen.3. B-Baum-Index: Das Ergebnis ist B-Baum (ausgeglichener Binärbaum)Wenn mehrere Spalten indiziert werden (kombinierter Index), ist die Reihenfolge der Spalten sehr wichtig, MySQL kann nur eine effektive Suche für das Präfix ganz links im Index durchführen.(2) Beispiel: Sein Index enthält die Spalten last_name, first_name und dob jeder Zeile in der Tabelle.<span class="pln">TABELLE ERSTELLEN <span class="typ">Personen<span class="pln "> <span class="pun">(<div> <div><div class="linenums"> <div class="L0"><code class="language-sql"><span class="pln">CREATE TABLE <span class="typ">People<span class="pln"> <span class="pun">(</span></span></span></span>
<span class="pln"> last_name varchar<span class="pun">(<span class="lit">50<span class="pun">)<span class="pln"> <span class="kwd">not<span class="pln"> <span class="kwd">null<span class="pun">,<div class="L2"><code class="language-sql"><span class="pln"> last_name varchar<span class="pun">(<span class="lit">50<span class="pun">)<span class="pln"> <span class="kwd">not<span class="pln"> <span class="kwd">null<span class="pun">,</span></span></span></span></span></span></span></span></span>
<span class="pln"> first_name varchar<span class="pun">(<span class="lit">50<span class="pun">)<span class="pln"> <span class="kwd">not<span class="pln"> <span class="kwd">null<span class="pun">,</span></span></span></span></span></span></span></span></span>
<span class="pln"> dob date <span class="kwd">not<span class="pln"> <span class="kwd">null<span class="pun">,</span></span></span></span></span>
<span class="pln"> gender <span class="kwd">enum<span class="pun">(<span class="str">'m'<span class="pun">,<span class="pln"> <span class="str">'f'<span class="pun">)<span class="pln"> <span class="kwd">not<span class="pln"> <span class="kwd">null<span class="pun">,</span></span></span></span></span></span></span></span></span></span></span></span></span>
<span class="pln">vorname varchar<span class="pun">(<span class="lit">50<span class="pun">)<span class="pln"> <span class="kwd">nicht<span class="pln"> <span class="kwd">null<span class="pun">, </span></span></span></span></span></span></span></span></span>
<span-klasse> Geburtsdatum <span class="kwd">nicht<span class="pln"> <span class="kwd">null<span class="pun">,</span></span></span></span></span-klasse>
<span class="pln">geschlecht <span class="kwd">enum<span class=" pun">(<span class="str">'m'<span class="pun">,<span class="pln"> <span class="str">'f'<span class="pun">)<span class="pln"> <span class="kwd">nicht<span class="pln"> <span class="kwd">null<span class="pun">,</span></span></span></span></span></span></span></span></span></span></span></span></span>
<span class="pln"> key<span class="pun">(<span class="pln">last_name<span class="pun">,<span class="pln"> first_name<span class="pun">,<span class="pln"> dob<span class="pun">)</span></span></span></span></span></span></span></span>
<span class="pun">);</span>
(3) Matching-Methode: Sie können entweder suchen oder sortieren nach [Die Ergebnisse werden sortiert, also ist die Suche einfach Schnell]
(4) Einschränkungen1) Alle Werte abgleichen: Geben Sie bestimmte Werte für alle Spalten im Index an.2) Passen Sie das Präfix ganz links an: Sie können den Index verwenden, um die Person zu finden, deren Nachname Allen ist. Verwenden Sie einfach die erste Spalte im Index.3) Spaltenpräfix abgleichen: Sie können den Index beispielsweise verwenden, um Personen zu finden, deren Nachname mit J beginnt, wodurch nur Spalte 1 im Index verwendet wird .4) Bereichsabfrage übereinstimmender Werte: Sie können den Index verwenden, um Personen zu finden, deren Nachnamen zwischen Allen und Barrymore liegen, indem Sie nur die erste Spalte in verwenden Index.5) Der Matching-Teil ist präzise und der andere Teil ist Bereichsmatching: Sie können den Index verwenden, um Personen zu finden, deren Nachname Allen und deren Vorname ist beginnt mit dem Buchstaben K.6) Nur den Index abfragen: Wenn sich die abgefragten Spalten alle im Index befinden, besteht keine Notwendigkeit, den Wert des Tupels zu lesen.7) Wenn das Indexfeld A+B ist, wird der A-Index bei der Abfrage von A+C verwendet -> 🎜>
1) Die Abfrage muss in der Spalte ganz links im Index beginnen.2) Eine Indexspalte kann nicht übersprungen werden. Beispielsweise können Sie einen Index nicht verwenden, um eine Person zu finden, deren Nachname Smith war und die an einem bestimmten Tag geboren wurde.3) Die Speicher-Engine kann die Spalten auf der rechten Seite der Bereichsbedingung im Index nicht verwenden. Wenn Ihre Abfrageanweisung beispielsweise WHERE last_name="Smith" AND first_name LIKE 'J%' AND dob='1976-12-23' lautet, verwendet die Abfrage nur die ersten beiden Spalten im Index, da es sich bei LIKE um eine Bereichsabfrage handelt .
(2) Einschränkungen1) Der Hash-Index berechnet den Hash-Wert über die Hash-Funktion zum Abrufen und kann den Zeilenzeiger der zu durchsuchenden Daten finden und so die Daten lokalisieren.2) Der Hash-Wert hängt nicht vom Datentyp der Spalte ab. Der Index einer TINYINT-Spalte ist so groß wie der Index einer langen Zeichenfolge Spalte.3) Die Speicherspeicher-Engine unterstützt nicht eindeutige Hash-Indizes. Wenn mehrere Werte denselben Hash-Code haben, speichert der Index ihre Zeilenzeiger in einem verknüpfte Liste an derselben Stelle in einem Hash-Tabelleneintrag.
1) Da der Index nur Hash-Code und Datensatzzeiger enthält, kann MySQL nicht vermeiden Lesen von Datensätzen mithilfe von Indizes. Der Zugriff auf Datensätze im Speicher erfolgt jedoch sehr schnell und hat keine großen Auswirkungen auf die Leistung.2) Die Hash-Index-Sortierung kann nicht verwendet werden.3) Der Hash-Index unterstützt keine teilweise Übereinstimmung von Schlüsseln, da der Hash-Wert über den gesamten Indexwert berechnet wird.4) Der Hash-Index unterstützt nur Gleichheitsvergleiche, z. B. die Verwendung von =, IN() und <=>. Bei WHERE-Preis>100 wird die Abfrage nicht beschleunigt.
<span-klasse>CREATE TABLE testhash <span class="pun">(<div class="L0"><code class="language-sql"><span class="pln">CREATE TABLE testhash <span class="pun">(</span></span>
<span class="pln"> fname VARCHAR<span class="pun">(<span class="lit">50<span class="pun">)<span class="pln"> NOT NULL<span class="pun">,<code class="language-sql"><span class="pln"> fname VARCHAR<span class="pun">(<span class="lit">50<span class="pun">)<span class="pln"> NOT NULL<span class="pun">,</span></span></span></span></span></span>
<span class="pln"> lname VARCHAR<span class="pun">(<span class="lit">50<span class="pun">)<span class="pln"> NOT NULL<span class="pun">,</span></span></span></span></span></span>
<span class="pln"> <em><span style="color: #000000">KEY USING HASH</span></em><em><span style="color: #000000"><span class="pun">(<span class="pln">fname<span class="pun">)</span></span></span></span></em></span>
<span class="pln"> lname VARCHAR<span class="pun">(<span class="lit">50<span class="pun">)<span class="pln"> NOT NULL<span class="pun">,<div class="L4"><code class="language-sql"><span class="pun">)<span class="pln">ENGINE<span class="pun">=<span class="pln">MEMORY<span class="pun">;</span></span></span></span></span>
<span class="pln"> <em><span style="color: # 000000">SCHLÜSSEL MIT HASH<div><em><span style="color: #000000"><span class="pun">(<span class="pln">fname<span class=" Wortspiel">)</span></span></span></span></em></div>
<div>
<div></div>
<div></div>
</div>
<code class="Sprache-SQL"><span class="Wortspiel">)<span class="pln">MOTOR<span class="pun">=<span class="pln">SPEICHER<span class="pun">;<div></div>
<div></div> </span></span></span></span></span>
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in Schlüssel und Index in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!