Dieser Artikel beschreibt die MySQL-Integritätsbeschränkungen. Teilen Sie uns die Einzelheiten zu Ihrer Information mit: Hauptinhalt
Einschränkungen: dienen der Gewährleistung der Datenintegrität und -konsistenz Hauptsächlich unterteilt in
einzigartig In MySQL heißt es single column unique #Beispiel 1: Tabelle Abteilung erstellen( Ich würde int, Name char(10) eindeutig ); mysql> in Abteilungswerte einfügen (1, 'es'), (2, 'es'); FEHLER 1062 (23000): Doppelter Eintrag „it“ für Schlüssel „name“ #Beispiel 2: Tabelle Abteilung erstellen( ID int eindeutig, Name char(10) eindeutig ); in Abteilungswerte einfügen(1,'es'),(2,'Verkauf'); #Die zweite Möglichkeit zum Erstellen einer einzigartigen Create-Table-Abteilung ( Ich würde int, Name char(10) , eindeutig (ID), einzigartig (Name) ); in Abteilungswerte einfügen(1,'es'),(2,'Verkauf'); Gemeinsam eindeutig: Solange zwei Datensatzspalten eine unterschiedliche Spalte aufweisen, ist die Einschränkung „Gemeinsam eindeutig“ erfüllt. # Erstellen Sie die Dienstetabellemysql> create table services( -> ID int, -> ip char(15), -> Port-Int, -> eindeutige ID, -> eindeutig (IP, Port) -> ); Abfrage OK, 0 Zeilen betroffen (0,05 Sek.) mysql> Beschreibungsdienste; +-------+----------+------+-----+---------+---------+----------+ | Feld | Typ | Null | Schlüssel | Standard | Extra | +-------+----------+------+-----+---------+---------+----------+ | Ich würde | int(11) | JA | UNI | NULL | | | ip | char(15) | JA | MUL | NULL | | | Port | int(11) | JA | | NULL | | +-------+----------+------+-----+---------+---------+----------+ 3 Zeilen im Satz (0,01 Sek.) #Gemeinsam eindeutig, solange zwei Spalten mit Datensätzen eine unterschiedliche Spalte haben, wird die Einschränkung „gemeinsam eindeutig“ erfüllt. mysql> In Dienstewerte einfügen -> (1,'192,168,11,23',80), -> (2,'192,168,11,23',81), -> (3,'192,168,11,25',80); Abfrage OK, 3 Zeilen betroffen (0,01 Sek.) Datensätze: 3 Duplikate: 0 Warnungen: 0 mysql> wähle * aus Diensten; +------+--------------+------+ | ID | IP | Port | +------+--------------+------+ | 1 | 192,168,11,23 | 80 | | 2 | 192,168,11,23 | 81 | | 3 | 192,168,11,25 | 80 | +------+--------------+------+ 3 Zeilen im Satz (0,00 Sek.) mysql> in Dienstewerte einfügen (4,'192,168,11,23',80); FEHLER 1062 (23000): Doppelter Eintrag „192,168,11,23-80“ für Schlüssel „ip“ auto_increment Einschränkung: Das eingeschränkte Feld wird automatisch erhöht, und das eingeschränkte Feld muss auch durch den Schlüssel eingeschränkt werden Wenn Sie keine ID angeben, wird sie automatisch erweitert. # Schüler anlegen Tabelle „Student“ erstellen ( ID int Primärschlüssel auto_increment, Name varchar(20), Geschlecht enum('männlich','weiblich') Standard 'männlich' ); mysql> Beschreibung Student; +-------+----------------------+------+-----+---------+----------------+ | Feld | Typ | Null | Schlüssel | Standard | Extra | +-------+----------------------+------+-----+---------+----------------+ | id | int(11) | NEIN | PRI | NULL | auto_increment | | Name | varchar(20) | JA | | NULL | | | Geschlecht | enum('männlich','weiblich') | JA | | männlich | | +-------+----------------------+------+-----+---------+----------------+ Zeilen im Satz (0,17 Sek.) #Datensätze einfügenmysql> insert into student(name) values ('Name'),('Name'); Abfrage OK, 2 Zeilen betroffen (0,01 Sek.) Datensätze: 2 Duplikate: 0 Warnungen: 0 mysql> wähle * vom Studenten aus; +----+--------+------+ | ID | Name | Geschlecht | +----+--------+------+ | 1 | Lao Bai | männlich | | 2 | Xiaobai | männlich | +----+--------+------+ Zeilen im Set (0,00 Sek.) Bei der Angabe einer ID mysql> in Studentenwerte einfügen (4, 'asb', 'weiblich'); Abfrage OK, 1 Zeile betroffen (0,00 Sek.) mysql> in Studentenwerte einfügen (7, 'wsb', 'weiblich'); Abfrage OK, 1 Zeile betroffen (0,01 Sek.) mysql> wähle * vom Studenten aus; +----+--------+--------+ | ID | Name | Geschlecht | +----+--------+--------+ | 1 | Lao Bai | männlich | | 2 | Xiaobai | männlich | | 4 | asb | weiblich | | 7 | wsb | weiblich | +----+--------+--------+ Zeilen im Set (0,00 Sek.) # Wenn Sie einen Datensatz einfügen, ohne erneut eine ID anzugeben, wird er ab dem vorherigen letzten Datensatz weiter wachsenmysql> insert into student(name) values ('大白'); Abfrage OK, 1 Zeile betroffen (0,00 Sek.) mysql> wähle * vom Studenten aus; +----+--------+--------+ | ID | Name | Geschlecht | +----+--------+--------+ | 1 | Lao Bai | männlich | | 2 | Xiaobai | männlich | | 4 | asb | weiblich | | 7 | wsb | weiblich | | 8 | Dabai | männlich | +----+--------+--------+ Zeilen im Set (0,00 Sek.) Wenn Sie bei einem Auto-Inkrement-Feld nach dem Löschen mit „delete“ erneut einen Wert einfügen, wird das Feld entsprechend der Position vor dem Löschen weiter vergrößert. mysql> aus Student löschen; Abfrage OK, 5 Zeilen betroffen (0,00 Sek.) mysql> wähle * vom Studenten aus; Leerer Satz (0,00 Sek.) mysql> wähle * vom Studenten aus; Leerer Satz (0,00 Sek.) mysql> in Student(Name) Werte einfügen('ysb'); Abfrage OK, 1 Zeile betroffen (0,01 Sek.) mysql> wähle * vom Studenten aus; +----+------+------+ | ID | Name | Geschlecht | +----+------+------+ | 9 | ysb | männlich | +----+------+------+ Zeile im Satz (0,00 Sek.) #Sie sollten truncate verwenden, um die Tabelle zu löschen. Im Vergleich zu delete, das Datensätze einzeln löscht, löscht truncate die Tabelle direkt. Verwenden Sie es, wenn Sie eine große Tabelle löschen.mysql> truncate student; Abfrage OK, 0 Zeilen betroffen (0,03 Sek.) mysql> in Student(Name) Werte einfügen('xiaobai'); Abfrage OK, 1 Zeile betroffen (0,00 Sek.) mysql> wähle * vom Studenten aus; +----+---------+------+ | ID | Name | Geschlecht | +----+---------+------+ | 1 | xiaobai | männlich | +----+---------+------+ Zeile im Satz (0,00 Sek.) MySQL> auto_increment_increment und auto_increment_offset Verfügbare Wörter anzeigen, die mit „auto_inc“ beginnen mysql> Variablen wie „auto_inc%“ anzeigen; +--------------------------+----------+ | Variablenname | Wert | +--------------------------+----------+ | auto_increment_increment | 1 | | automatischer Inkrementversatz | 1 | +--------------------------+----------+ Zeilen im Satz (0,02 Sek.) # Schrittlänge auto_increment_increment, Standard ist 1 # Der Startoffset auto_increment_offset, der Standardwert ist 1 # Stellen Sie die Schrittweite auf die Sitzungseinstellungen ein, die nur in dieser Verbindung gültig sind. set session auto_increment_increment=5; #Globale Schrittgrößeneinstellungen sind gültig. setze global auto_increment_increment=5; # Legen Sie den Startoffset fest. set global auto_increment_offset=3; Hervorhebung: Wenn der Wert von auto_increment_offset größer ist als der von auto_increment_increment, wird der Wert von auto_increment_offset ignoriert. Führen Sie nach dem Festlegen des Startversatzes und der Schrittweite erneut die Showvariablen wie „auto_inc%“ aus. Ich habe festgestellt, dass ich es genau wie zuvor zuerst beenden und dann anmelden musste, damit es funktionierte. mysql> Variablen wie „auto_inc%“ anzeigen; +--------------------------+----------+ | Variablenname | Wert | +--------------------------+----------+ | auto_increment_increment | 5 | | automatischer Inkrementversatz | 3 | +--------------------------+----------+ Zeilen im Set (0,00 Sek.) #Weil es vorher einen Datensatz mit der ID=1 gab mysql> wähle * vom Studenten aus; +----+---------+------+ | ID | Name | Geschlecht | +----+---------+------+ | 1 | xiaobai | männlich | +----+---------+------+ Zeile im Satz (0,00 Sek.) # Beginnen Sie beim nächsten Einfügen an Position 3 und fügen Sie jedes Mal die Datensatz-ID + 5 ein mysql> in Student(Name) einfügen Werte('ma1'),('ma2'),('ma3'); Abfrage OK, 3 Zeilen betroffen (0,00 Sek.) Datensätze: 3 Duplikate: 0 Warnungen: 0 mysql> wähle * vom Studenten aus; +----+---------+------+ | ID | Name | Geschlecht | +----+---------+------+ | 1 | xiaobai | männlich | | 3 | ma1 | männlich | | 8 | ma2 | männlich | | 13 | ma3 | männlich | +----+---------+------+ Beim Leeren einer Tabelle unterscheidet man zwischen Löschen und Abschneiden: löschen aus t1; #Wenn eine automatisch inkrementierende ID vorhanden ist, beginnen die neu hinzugefügten Daten trotzdem mit der letzten vor der Löschung. Tabelle t1 abschneiden; Die Datenmenge ist groß, die Löschgeschwindigkeit ist schneller als die vorherige und es wird direkt von vorne begonnen. Fremdschlüssel Informationen zu Fremdschlüsseln Wie in der obigen Abbildung gezeigt, entspricht in einem Unternehmen mit vielen Mitarbeitern jeder Mitarbeiter einer Abteilung. Diese Abteilungen werden beim Ausfüllen des Formulars wiederholt geschrieben, was zu redundant ist. Wir können sie trennen Derzeit gibt es zwei Tabellen, eine ist die Mitarbeitertabelle, die als Emp-Tabelle bezeichnet wird (Assoziationstabelle, auch als Slave-Tabelle bezeichnet). Eine davon ist die Abteilungstabelle, die als Dep-Tabelle bezeichnet wird (zugehörige Tabelle, auch Haupttabelle genannt). #1. Wenn Sie eine Tabelle erstellen, erstellen Sie zuerst die zugehörige Tabelle und dann die zugehörige Tabelle.# Erstellen Sie zuerst die zugehörige Tabelle (Dep-Tabelle). Tabelle erstellen dep( id int Primärschlüssel, Name varchar(20) nicht null, beschreibe varchar(20) nicht null ); # Erstellen Sie eine zugehörige Tabelle (emp-Tabelle) Tabelle emp erstellen( id int Primärschlüssel, Name varchar(20) nicht null, Alter int ungleich null, dep_id int, Einschränkung fk_dep Fremdschlüssel (dep_id) Referenzen dep (id) //Einschränkung erstellen); #2. Beim Einfügen von Datensätzen zuerst Datensätze in die zugehörige Tabelle einfügen, dann Datensätze in die zugehörige Tabelle einfügen und in Dep-Werte einfügen (1,'IT','Abteilung für IT-Technologie'), (2, „Verkaufsabteilung“, „Verkaufsabteilung“), (3, „Finanzabteilung“, „Abteilung, die zu viel Geld ausgibt“); in emp-Werte einfügen (1,'zhangsan',18,1), (2,'lisi',19,1), (3,'egon',20,2), (4,'yuanhao',40,3), (5,'alex',18,2); 3. Löschen Sie die Tabelle #Logisch gesehen werden, wenn eine Abteilung in der Abteilungstabelle gelöscht wird, die zugehörigen Datensätze in der Mitarbeitertabelle nacheinander gelöscht. mysql> löschen aus dep, wo id=3; FEHLER 1451 (23000): Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl (`db5`.`emp`, CONSTRAINT `fk_name` FOREIGN KEY (`dep_id`) REFERENCES `dep` (`id`)) #Aber es gibt kein Problem beim Löschen der aktuellen Abteilung, nachdem die Datensätze in der Mitarbeitertabelle gelöscht wurden mysql> delete from emp where dep_id =3; Abfrage OK, 1 Zeile betroffen (0,00 Sek.) mysql> wähle * aus emp; +----+----------+-----+--------+ | ID | Name | Alter | dep_id | +----+----------+-----+--------+ | 1 | zhangsan | 18 | 1 | | 2 | lisi | 18 | 1 | | 3 | egon | 20 | 2 | | 5 | Alex | 18 | 2 | +----+----------+-----+--------+ 4 Zeilen im Satz (0,00 Sek.) mysql> löschen aus dep, wo id=3; Abfrage OK, 1 Zeile betroffen (0,00 Sek.) mysql> wähle * aus dep; +----+-----------+----------------------+ | ID | Name | Beschreibung | +----+-----------+----------------------+ | 1 | IT | IT-Technologie Limited | | 2 | Verkaufsabteilung | Verkaufsabteilung | +----+-----------+----------------------+ 2 Zeilen im Satz (0,00 Sek.) Der obige Vorgang zum Löschen von Tabellendatensätzen ist ziemlich kompliziert. Logischerweise werden bei Entlassungen in einer Abteilung auch die Mitarbeiter dieser Abteilung entlassen. Tatsächlich gibt es beim Erstellen einer Tabelle einen weiteren sehr wichtigen Inhalt, der als synchrones Löschen und synchrones Aktualisieren bezeichnet wird. bei Löschkaskade #Synchronisiertes Löschen Tabelle emp erstellen( id int Primärschlüssel, Name varchar(20) nicht null, Alter int ungleich null, dep_id int, Einschränkung fk_dep Fremdschlüssel(dep_id) Referenzen dep(id) bei Löschkaskade #synchrones Löschen bei Aktualisierungskaskade #synchrones Update); # Löschen Sie die Datensätze in der zugehörigen Tabelle (dep) und löschen Sie die Datensätze in der zugehörigen Tabelle (emp) mysql> delete from dep where id=3; Abfrage OK, 1 Zeile betroffen (0,00 Sek.) mysql> wähle * aus dep; +----+-----------+----------------------+ | ID | Name | Beschreibung | +----+-----------+----------------------+ | 1 | IT | IT-Technologie Limited | | 2 | Verkaufsabteilung | Verkaufsabteilung | +----+-----------+----------------------+ 2 Zeilen im Satz (0,00 Sek.) mysql> wähle * aus emp; +----+----------+-----+--------+ | ID | Name | Alter | dep_id | +----+----------+-----+--------+ | 1 | zhangsan | 18 | 1 | | 2 | lisi | 19 | 1 | | 3 | egon | 20 | 2 | | 5 | Alex | 18 | 2 | +----+----------+-----+--------+ 4 Zeilen im Satz (0,00 Sek.) #Ändern Sie die Datensätze in der zugehörigen Tabelle (dep) und auch die Datensätze in der zugehörigen Tabelle (emp).mysql> update dep set id=222 where id=2; Abfrage OK, 1 Zeile betroffen (0,02 Sek.) Übereinstimmende Zeilen: 1 Geändert: 1 Warnungen: 0 # Überprüfen Sie schnell, ob beide Tabellen gelöscht und geändert wurdenmysql> select * from dep; +-----+-----------+----------------------+ | ID | Name | Beschreibung | +-----+-----------+----------------------+ | 1 | IT | IT-Technologie Limited | | 222 | Verkaufsabteilung | Verkaufsabteilung | +-----+-----------+----------------------+ 2 Zeilen im Satz (0,00 Sek.) mysql> wähle * aus emp; +----+----------+-----+--------+ | ID | Name | Alter | dep_id | +----+----------+-----+--------+ | 1 | zhangsan | 18 | 1 | | 2 | lisi | 19 | 1 | | 3 | egon | 20 | 222 | | 5 | Alex | 18 | 222 | +----+----------+-----+--------+ 4 Zeilen im Satz (0,00 Sek.) Leser, die an weiteren MySQL-bezogenen Inhalten interessiert sind, können sich die folgenden Themen auf dieser Site ansehen: „MySQL-Abfragekenntnisse“, „Zusammenfassung der allgemeinen MySQL-Funktionen“, „MySQL-Protokolloperationskenntnisse“, „Zusammenfassung der MySQL-Transaktionsoperationskenntnisse“, „MySQL-gespeicherte Prozedurkenntnisse“ und „Zusammenfassung der MySQL-Datenbanksperrenkenntnisse“. Ich hoffe, dass dieser Artikel für jedermann beim Entwurf einer MySQL-Datenbank hilfreich ist. Das könnte Sie auch interessieren:
|
<<: Ein Artikel zum Lösen des Echarts-Kartenkarussell-Highlights
>>: So ändern Sie die Tomcat-Portnummer in Linux
In diesem Artikel wird anhand eines Beispiels bes...
Ich habe einen falschen MySQL-Befehl eingegeben u...
Problembeschreibung Wie wir alle wissen, lautet d...
In diesem Artikel werden hauptsächlich Codebeispi...
1. Replikationsprinzip Der Masterserver schreibt ...
Es gibt häufig Szenarien, in denen das Bild an di...
Die Schlüsselcodes lauten wie folgt: Code kopieren...
Jeder weiß, dass Bilder auf Webseiten im Allgemein...
[LeetCode] 180. Aufeinanderfolgende Zahlen Schrei...
Wir alle wissen, dass die in der Front-End-Entwic...
Fehlerbeschreibung Wenn wir Docker Desktop instal...
/******************** * Zeichengerätetreiber*****...
Inhaltsverzeichnis 1. filter() 2. fürJedes() 3. e...
Dieser Artikel testet die Umgebung: CentOS 7 64-B...
Das Flex-Layout ist zweifellos einfach und leicht...