Heim >Datenbank >MySQL-Tutorial >Detaillierte Einführung in MySQL-Integritätsbeschränkungen

Detaillierte Einführung in MySQL-Integritätsbeschränkungen

王林
王林nach vorne
2019-08-28 14:06:092805Durchsuche

1. Einführung

Einschränkungsbedingungen entsprechen der Breite des Datentyps und sind optionale Parameter

Funktion: Wird verwendet, um die Datenintegrität und -konsistenz sicherzustellen.

ist hauptsächlich unterteilt in:

PRIMARY KEY (PK) #Identifiziert dieses Feld als Primärschlüssel der Tabelle, der eindeutig sein kann Identifizieren Sie den Datensatz

FOREIGN KEY (FK) #Identifiziert dieses Feld als Fremdschlüssel der Tabelle

NOT NULL #Identifiziert, dass dieses Feld nicht leer sein darf

UNIQUE KEY (UK) #Identifiziert dieses Feld. Der Wert ist eindeutig

AUTO_INCREMENT #Der Wert, der das Feld identifiziert, wird automatisch erhöht (Ganzzahltyp und Primärschlüssel)

DEFAULT #Set ein Standardwert für das Feld

UNSIGNED #Unsigned

ZEROFILL #Verwenden Sie 0 zum Ausfüllen von

Beschreibung:

#1. Ob leer, standardmäßig NULL, NOT NULL zugelassen werden soll, das Feld darf nicht leer sein und ihm muss ein Wert zugewiesen werden

#2 Ob das Feld einen Standardwert hat, Der Standardwert ist NULL. Wenn dem Feld beim Einfügen des Datensatzes kein Wert zugewiesen wird, verwendet dieses Feld den Standardwert

Sex Enum('männlich', 'weiblich') und nicht den Null-Standardwert 'männlich'

#muss ein positiver Wert sein (ohne Vorzeichen), darf nicht leer sein, der Standardwert ist 20age int unsigned NOT NULL Standard 20

# 3. Ob es sich um einen Schlüssel

primär handelt Schlüssel Primärschlüssel

Fremdschlüssel Fremdschlüssel

Index (Index, eindeutig...)

2. NICHT NULL und STANDARD

ist nullbar, null bedeutet leer, kein String
nicht null – nicht nullbar
null – nullbar

Standardwert, Sie können den Standardwert beim Erstellen eines angeben Spalte, wenn sie beim Einfügen von Daten nicht aktiv gesetzt wird, wird der Standardwert automatisch hinzugefügt

create table tb1(
    nid int not null defalut 2,    
    num int not null);

Hinweis:

Der Standardwert kann leer sein

2. Stellen Sie nicht null ein und es darf beim Einfügen des Werts nicht leer sein

3 Nachdem Sie das ID-Feld auf einen Standardwert festgelegt haben, spielt es keine Rolle, ob das ID-Feld null ist oder nicht. Sie können Nullen einfügen. Beim Einfügen von Nullen wird der standardmäßig angegebene Standardwert ausgefüllt

3. EINZIGARTIG

Chinesische Übersetzung: anders. In MySQL heißt es „einspaltig eindeutig“.

Beispiel: Erstellen Sie eine Unternehmensabteilungstabelle (jedes Unternehmen hat eine eindeutige Abteilung)

mysql> create table department(
    -> id int,
    -> name char(10)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> insert into department values(1,'IT'),(2,'IT');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> select * from department;
+------+------+| id   | name |
+------+------+|    1 | IT   |
|    2 | IT   |
+------+------+2 rows in set (0.00 sec)
# 发现: 同时插入两个IT部门也是可以的,但这是不合理的,所以我们要设置name字段为unique 解决这种不合理的现象。

Als nächstes verwenden Sie die Einschränkung „unique“, um die festzulegenden Unternehmensabteilungsfelder zu definieren .

#第一种创建unique的方式#例子1:create table department(
    id int,
    name char(10) unique
);
mysql> insert into department values(1,'it'),(2,'it');
ERROR 1062 (23000): Duplicate entry 'it' for key 'name'
#例子2:create table department(
    id int unique,
    name char(10) unique
);
insert into department values(1,'it'),(2,'sale');
#第二种创建unique的方式create table department(
    id int,
    name char(10) ,    unique(id),    unique(name)
);
insert into department values(1,'it'),(2,'sale');

Gemeinsames Unique:

# 创建services表mysql> create table services(
        id int,
        ip char(15),
        port int,
        unique(id),
        unique(ip,port)
       );
Query OK, 0 rows affected (0.05 sec)

mysql> desc services;
+-------+----------+------+-----+---------+-------+
| Field | Type      | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id        | int(11)   | YES   | UNI  | NULL       |             
| ip        | char(15) | YES   | MUL  | NULL       |          
| port    | int(11) | YES   |          | NULL       |             
|+-------+----------+------+-----+---------+-------+|
3 rows in set (0.01 sec)
#联合唯一,只要两列记录,有一列不同,既符合联合唯一的约束mysql> insert into services values
       (1,'192,168,11,23',80),
       (2,'192,168,11,23',81),
       (3,'192,168,11,25',80);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> select * from services;
+------+---------------+------+
| id   | ip            | port |
+------+---------------+------+
|    1 | 192,168,11,23 |   80 |
|    2 | 192,168,11,23 |   81 |
|    3 | 192,168,11,25 |   80 |
+------+---------------+------+
3 rows in set (0.00 sec)

mysql> insert into services values (4,'192,168,11,23',80);
ERROR 1062 (23000): Duplicate entry '192,168,11,23-80' for key 'ip'

4. PRIMÄRSCHLÜSSEL

Es gibt nur ein Unique in einer Tabelle in MySQL Ein Primärschlüssel kann nicht mehrere Spalten haben, aber er kann einen zusammengesetzten Primärschlüssel haben

Eine Tabelle kann Folgendes haben:

Eine einzelne Spalte als Primärschlüssel
Mehrere Spalten als Primärschlüssel Schlüssel (zusammengesetzter Primärschlüssel)

Einschränkung: Entspricht nicht null eindeutig, der Wert des Feldes ist nicht leer und eindeutig

Die Standardspeicher-Engine ist (innodb): Für die innodb-Speicher-Engine , muss eine Tabelle einen Primärschlüssel haben.

Einzelspaltiger Primärschlüssel:

# 创建t14表,为id字段设置主键,唯一的不同的记录create table t14(
    id int primary key,
    name char(16)
);
insert into t14 values(1,'xiaoma'),(2,'xiaohong');

mysql> insert into t14 values(2,'wxxx');
ERROR 1062 (23000): Duplicate entry '6' for key 'PRIMARY'
#   not null + unique的化学反应,相当于给id设置primary key
create table t15(
    id int not null unique,
    name char(16)
);
mysql> create table t15(
    -> id int not null unique,
    -> name char(16)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> desc t15;
+-------+----------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id        | int(11)  | NO     | PRI | NULL       |             |
| name   | char(16) | YES  |         | NULL       |             |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.02 sec)

Zusammengesetzter Primärschlüssel:

create table t16(
    ip char(15),
    port int,
    primary key(ip,port)
);
insert into t16 values('1.1.1.2',80),('1.1.1.2',81);

AUTO_INCREMENT

Einschränkungen: Die eingeschränkten Felder müssen gleichzeitig durch den Schlüssel eingeschränkt werden

create table student(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') default 'male'
);

1. Wenn die ID nicht angegeben ist, wird sie automatisch erweitert

2 . Sie können auch die ID angeben

3. Nach dem Löschen mit „Delete“ und dem anschließenden Einfügen des Werts wächst das Feld entsprechend der Position vor dem Löschen weiter

Der Unterschied zwischen auto_increment_increment und auto_increment_offset

查看可用的 开头auto_inc的词
mysql> show variables like 'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------+
rows in set (0.02 sec)
# 步长auto_increment_increment,默认为1
# 起始的偏移量auto_increment_offset, 默认是1

 # 设置步长 为会话设置,只在本次连接中有效
 set session auto_increment_increment=5;

 #全局设置步长 都有效。
 set global auto_increment_increment=5;

 # 设置起始偏移量
 set global  auto_increment_offset=3;

#强调:If the value of auto_increment_offset is greater than that of auto_increment_increment, 
the value of auto_increment_offset is ignored. 
翻译:如果auto_increment_offset的值大于auto_increment_increment的值,则auto_increment_offset的值会被忽略 

# 设置完起始偏移量和步长之后,再次执行show variables like'auto_inc%';
发现跟之前一样,必须先exit,再登录才有效。

mysql> show variables like'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 5     |
| auto_increment_offset    | 3     |
+--------------------------+-------+
rows in set (0.00 sec)

#因为之前有一条记录id=1
mysql> select * from student;
+----+---------+------+
| id | name    | sex  |
+----+---------+------+
|  1 | xiaobai | male |
+----+---------+------+
row in set (0.00 sec)
# 下次插入的时候,从起始位置3开始,每次插入记录id+5
mysql> insert into student(name) values('ma1'),('ma2'),('ma3');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> select * from student;
+----+---------+------+
| id | name    | sex  |
+----+---------+------+
|  1 | xiaobai | male |
|  3 | ma1     | male |
|  8 | ma2     | male |
| 13 | ma3     | male |
+----+---------+------+
auto_increment_increment和 auto_increment_offset

Löschen Sie die Tabelle, um den Unterschied zwischen delete und truncate zu unterscheiden:

löschen aus t1; #Wenn es ein Auto gibt -Inkrementierende ID, die neu hinzugefügten Daten beginnen immer noch mit den letzten vor dem Löschen.

Tabelle t1 abschneiden; Die Datenmenge ist groß, die Löschgeschwindigkeit ist schneller als bei der vorherigen und sie beginnt direkt bei Null.

6. AUSLÄNDISCHER SCHLÜSSEL

Das Unternehmen hat 3 Abteilungen, aber es gibt 100 Millionen Mitarbeiter, was bedeutet, dass das Abteilungsfeld wiederholt gespeichert werden muss, desto verschwenderischer es ist.

Zu diesem Zeitpunkt

Lösung:

Wir können eine Abteilungstabelle vollständig definieren

und dann die Mitarbeiterinformationstabelle mit der Tabelle „Wie“ verknüpfen lassen zuzuordnen, das ist ein Fremdschlüssel

Erstellen Sie zwei Tabellen:

#1.创建表时先创建被关联表,再创建关联表
# 先创建被关联表(dep表)
create table dep(
    id int primary key,
    name varchar(20) not null,
    descripe varchar(20) not null
);
#再创建关联表(emp表)
create table emp(
    id int primary key,
    name varchar(20) not null,
    age int not null,
    dep_id int,
    constraint fk_dep foreign key(dep_id) references dep(id) 
);
#2.插入记录时,先往被关联表中插入记录,再往关联表中插入记录
insert into dep values
(1,'IT','IT技术有限部门'),
(2,'销售部','销售部门'),
(3,'财务部','花钱太多部门');
insert into emp values
(1,'zhangsan',18,1),
(2,'lisi',19,1),
(3,'djb',20,2),
(4,'dogfa',40,3),
(5,'oldniu',18,2);
3.删除表
#按道理来说,删除了部门表中的某个部门,员工表的有关联的记录相继删除。
mysql> delete from dep where id=3;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails 
(`db5`.`emp`, CONSTRAINT `fk_name` FOREIGN KEY (`dep_id`) REFERENCES `dep` (`id`))
#但是先删除员工表的记录之后,再删除当前部门就没有任何问题
mysql> delete from emp where dep =3;
Query OK, 1 row affected (0.00 sec)
mysql> select * from emp;
+----+----------+-----+--------+
| id | name     | age | dep_id |
+----+----------+-----+--------+
|  1 | zhangsan |  18 |      1 |
|  2 | lisi     |  18 |      1 |
|  3 | djb      |  20 |      2 |
|  5 | oldniu   |  18 |      2 |
+----+----------+-----+--------+
rows in set (0.00 sec)
mysql> delete from dep where id=3;
Query OK, 1 row affected (0.00 sec)

mysql> select * from dep;
+----+-----------+----------------------+
| id | name      | descripe             |
+----+-----------+----------------------+
|  1 | IT        | IT技术有限部门       |
|  2 | 销售部    | 销售部门             |
+----+-----------+----------------------+
rows in set (0.00 sec)

Der obige Vorgang zum Löschen von Tabellendatensätzen ist logischerweise relativ umständlich, wenn eine Abteilung entlassen wird wird auch entlassen. Tatsächlich gibt es beim Erstellen einer Tabelle einen weiteren sehr wichtigen Inhalt, der als synchrones Löschen und synchrones Aktualisieren bezeichnet wird.

Als nächstes löschen Sie alle beiden gerade erstellten Tabellen. Löschen Sie zuerst die zugehörige Tabelle (emp) und dann Löschen die zugehörige Tabelle (dep)

Weiter:
Wiederholen Sie den obigen Vorgang, um die Tabelle zu erstellen
Hinweis : Fügen Sie
on delete cascade zur zugehörigen Tabelle hinzu #Synchrones Löschen
on update cascade # Synchrones Update

Emp-Tabelle ändern:

create table emp(    
    id int primary key,    
    name varchar(20) not null,
    age int not null,
    dep_id int,
    constraint fk_dep foreign key(dep_id) references dep(id) 
    on delete cascade #同步删除    
    on update cascade #同步更新
);

接下来的操作,就符合我们正常的生活中的情况了。

#再去删被关联表(dep)的记录,关联表(emp)中的记录也跟着删除
mysql> delete from dep where id=3;
Query OK, 1 row affected (0.00 sec)

mysql> select * from dep;
+----+-----------+----------------------+
| id | name      | descripe             |
+----+-----------+----------------------+
|  1 | IT        | IT技术有限部门       |
|  2 | 销售部    | 销售部门             |
+----+-----------+----------------------+
rows in set (0.00 sec)
mysql> select * from emp;
+----+----------+-----+--------+
| id | name     | age | dep_id |
+----+----------+-----+--------+
|  1 | zhangsan |  18 |      1 |
|  2 | lisi     |  19 |      1 |
|  3 | djb      |  20 |      2 |
|  5 | oldniu   |  18 |      2 |
+----+----------+-----+--------+
rows in set (0.00 sec)

#再去更改被关联表(dep)的记录,关联表(emp)中的记录也跟着更改

 mysql> update dep set id=222 where id=2; 
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0
# 赶紧去查看一下两张表是否都被删除了,是否都被更改了
mysql> select * from dep;
+-----+-----------+----------------------+
| id  | name      | descripe             |
+-----+-----------+----------------------+
|   1 | IT        | IT技术有限部门       |
| 222 | 销售部    | 销售部门             |
+-----+-----------+----------------------+
rows in set (0.00 sec)
mysql> select * from emp;
+----+----------+-----+--------+
| id | name     | age | dep_id |
+----+----------+-----+--------+
|  1 | zhangsan |  18 |      1 |
|  2 | lisi     |  19 |      1 |
|  3 | djb      |  20 |    222 |
|  5 | oldniu   |  18 |    222 |
+----+----------+-----+--------+
rows in set (0.00 sec)

以上便是常用约束的详细实例介绍,想了解更多相关问题请访问PHP中文网:mysql视频教程

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in MySQL-Integritätsbeschränkungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen