Maison >base de données >tutoriel mysql >Introduction détaillée à la clé et à l'index dans MySQL
2. Clé primaire et clé unique
1) Le point de départ /function est différent : le premier est l'identifiant unique d'une ligne de données, tandis que le second n'est utilisé que pour éviter la duplication des données.
2) Une ou plusieurs colonnes de la première doivent toutes être non nulles ; si l'une des colonnes est nulle, elle deviendra non nulle lors de l'ajout de la clé primaire. Si la clé primaire est supprimée, le caractère nullable de la colonne. va changer. Cette dernière colonne peut être nulle.
3) Une table ne peut avoir qu’une seule clé primaire et peut avoir plusieurs clés uniques. [Une table peut-elle n'avoir pas de clé primaire ? ? ? 】
4) Pour la colonne correspondant à la clé unique, null peut être inséré plusieurs fois (bien que ce soit aussi une sorte de répétition) ; .
create table t(id int, key (id)); S'il existe d'autres clés utilisant id (comme une clé étrangère), utilisez d'autres clés pour la nommer If ; aucun n'est nommé, l'identifiant est utilisé ; si plusieurs colonnes sont spécifiées comme clés à la fois, le nom de la première colonne est utilisé comme nom de clé.create table t(id int, key kismet(id)); préciser le nom de la clécontrainte : ne peut pas être utilisée, après tout, c'est ordinaire La clé n'a aucun effet de contrainte
créer une table t(id int, clé primaire (id));créer une table t(id int, clé primaire kismet(id )); peut être exécuté, mais le nom ne fonctionne pascréer une table t(id int, contrainte kismet Primary Key(id)); , mais le nom ne fonctionne pas
create table t(id int, unique key (id)); Les règles de dénomination sont différentes de key. Seule la première colonne est utilisée comme nom de clécreate table t(id int, unique key kismet( id)); Précisez le nom de la clécreate table t(id int, contrainte kismet unique key(id)); Préciser le nom de la clé
créer une table t(id int, Foreign key (dage_id) fait référence à dage(id)); peut être exécuté, et le résultat de l'exécution est une clé étrangère automatiquement nommée et une clé ordinaire automatiquement nommée.créer une table t(id int, les références de clé étrangère kismet(dage_id) dage(id)); clé étrangère et une clé normale nommée kismet.créer une table t(id int, contrainte kismet Foreign Key(dage_id) références dage(id)); une table nommée La clé étrangère de kismet et une clé normale nommée kismet.
4. ExempleRESTRICT (restreindre les modifications de clé étrangère dans l'apparence, par défaut)CASCADE (suivre les changements de clé étrangère)SET NULL (définir la valeur nulle)CONFIGURER PAR DÉFAUTAUCUNE ACTION
<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"> PRIMARY KEY <span class="pun">(<span class="str">`id`<span class="pun">),</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>
<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>
<span class="pln">CRÉER UNE TABLE <span class="typ">Personnes<span class="pln "> <span class="pun">(<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">,</span></span></span></span></span></span></span></span></span>
<span class="pln"> nom de famille varchar<span class="pun">(<span class="lit">50<span class="pun">)<span class="pln"> <span class="kwd">pas<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"> prénom varchar<span class="pun">(<span class="lit">50<span class="pun">)<span class="pln"> <span class="kwd">pas<span class="pln"> <span class="kwd">null<span class="pun">, </span></span></span></span></span></span></span></span></span>
<classe span="pln"> date de naissance <span class="kwd">pas<span class="pln"> <span class="kwd">null<span class="pun">,</span></span></span></span></classe>
<span class="pln"> sexe <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">pas<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>
(4) Limitations1) Faire correspondre toutes les valeurs : Spécifiez des valeurs spécifiques pour toutes les colonnes de l'index.2) Faites correspondre le préfixe le plus à gauche : vous pouvez utiliser l'index pour trouver la personne dont le nom de famille est Allen, utilisez simplement la première colonne de l'index.3) Faire correspondre le préfixe de la colonne : par exemple, vous pouvez utiliser l'index pour rechercher des personnes dont le nom de famille commence par J, ce qui utilise uniquement la colonne 1 de l'index. .4) Requête de plage de valeurs correspondantes : vous pouvez utiliser l'index pour rechercher des personnes dont le nom de famille est compris entre Allen et Barrymore, en utilisant uniquement la première colonne du indice.5) La partie correspondante est précise et l'autre partie est une correspondance de plage : vous pouvez utiliser l'index pour trouver des personnes dont le nom de famille est Allen et dont le prénom commence par la lettre K.6) Interroger uniquement l'index : Si les colonnes interrogées sont toutes situées dans l'index, il n'est pas nécessaire de lire la valeur du tuple.7) Si le champ d'index est A+B, l'index A sera-t-il utilisé lors de l'interrogation de A+C -> 🎜>
1) La requête doit commencer à partir de la colonne la plus à gauche de l'index.2) Une colonne d'index ne peut pas être ignorée. Par exemple, vous ne pouvez pas utiliser un index pour rechercher une personne dont le nom de famille était Smith et qui est née un certain jour.3) Le moteur de stockage ne peut pas utiliser les colonnes du côté droit de la condition de plage dans l'index. Par exemple, si votre instruction de requête est WHERE last_name="Smith" AND first_name LIKE 'J%' AND dob='1976-12-23', la requête utilisera uniquement les deux premières colonnes de l'index car LIKE est une requête par plage. .
(2) Limitations1) L'index de hachage calcule la valeur de hachage via la fonction de hachage pour la récupération et peut trouver le pointeur de ligne des données à rechercher, localisant ainsi les données.2) La valeur de hachage ne dépend pas du type de données de la colonne. L'index d'une colonne TINYINT est aussi grand que l'index d'une longue chaîne. colonne.3) Le moteur de stockage mémoire prend en charge les index de hachage non uniques. Si plusieurs valeurs ont le même code de hachage, l'index enregistre leurs pointeurs de ligne dans un fichier. liste chaînée au même emplacement dans une entrée de table de hachage.
1) Étant donné que l'index ne contient que du code de hachage et un pointeur d'enregistrement, MySQL ne peut pas éviter lire des enregistrements à l'aide d'index. Mais l'accès aux enregistrements en mémoire est très rapide et n'aura pas beaucoup d'impact sur les performances.2) Le tri par index de hachage ne peut pas être utilisé.3) L'index de hachage ne prend pas en charge la correspondance partielle des clés, car la valeur de hachage est calculée à travers la valeur entière de l'index.4) L'index de hachage ne prend en charge que la comparaison d'égalité, par exemple en utilisant =, IN() et <=>. Pour WHERE price>100, cela n’accélère pas la requête.
<classe span="pln">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"> NON 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">CLÉ UTILISANT LE HASH<div><em><span style="color: #000000"><span class="pun">(<span class="pln">fname<span class=" jeu de mots">)</span></span></span></span></em></div>
<div>
<div></div>
<div></div>
</div>
<code class="langue-sql"><span class="pun">)<span class="pln">MOTEUR<span class="pun">=<span class="pln">MÉMOIRE<span class="pun">;<div></div>
<div></div> </span></span></span></span></span>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!