Maison >base de données >tutoriel mysql >Exemple d'analyse des points de connaissance des contraintes MySQL
Cet article vous apporte des connaissances pertinentes sur mysql, qui organise principalement les problèmes liés aux contraintes. Les contraintes visent à garantir l'intégrité des données. L'intégrité des données fait référence à l'exactitude et à la fiabilité des données. la base de données qui ne respecte pas les réglementations sémantiques et il est proposé d'empêcher les opérations non valides ou les messages d'erreur causés par l'entrée et la sortie d'informations erronées. Examinons-le ensemble, j'espère que cela sera utile à tout le monde.
Apprentissage recommandé : Tutoriel vidéo MySQL
L'intégrité des données (intégrité des données) fait référence à l'exactitude des données. Fiabilité. Il est proposé d'empêcher l'existence de données non conformes aux réglementations sémantiques dans la base de données et d'empêcher les opérations invalides ou les messages d'erreur provoqués par l'entrée et la sortie d'informations incorrectes.
Afin de garantir l'intégrité des données, SQL Les normes restreignent Les données du tableau appliquent des restrictions conditionnelles supplémentaires . Tenez compte des quatre aspects suivants : Intégrité de l'entité ) : Par exemple, il ne peut pas y avoir deux enregistrements identiques et indiscernables dans la même table
Intégrité du domaine (Intégrité du domaine ) : Par exemple : tranche d'âge 0-120 , plage de genre " mâle / femelle "
" Intégrité référentielle ) : Par exemple : le département où se trouve le salarié, ce département doit se trouver dans la table des départements
- Intégrité définie ) : Par exemple : le nom d'utilisateur est unique, le mot de passe ne peut pas être vide, etc. Le salaire du responsable de ce service ne doit pas être supérieur à 5% du salaire moyen des employés de ce service. fois.
1.2 Que sont les contraintes - restrictions sur les champs d'une table
À retrouver sur Spécifier des contraintes lors de la création d'une table (via CRÉER UN TABLEAU déclaration) , ou dans Passé après la création de la table MODIFIER LA TABLE Stipulation de la déclaration
Contraintes .
1.3 Classification des contraintes
Position |
Types de contraintes pris en charge . | Est-il possible de nommer la contrainte |
Contraintes au niveau de la colonne : |
Après la colonne |
la syntaxe est prise en charge, mais les clés étrangères n'ont aucun effet | Pas question |
|
Contraintes au niveau de la table : |
Sous toutes les colonnes |
Les valeurs par défaut et non vides ne sont pas prises en charge, les autres sont prises en charge | Oui (clé primaire n'a aucun effet) |
Selon le rôle des contraintes
, les contraintes peuvent être divisées en :
1. NOT NULL Contrainte non nulle, qui stipule qu'un certain champ ne peut pas être vide
2. Contrainte unique UNIQUE, qui stipule qu'un certain champ est unique dans toute la table
3. Contrainte de clé primaire PRIMARY KEY (non nulle et unique)
4. Contraintes de clé étrangère FOREIGN KEY
5. VÉRIFIER les contraintes de vérification
6. Contrainte de valeur par défaut par défaut
Remarque: MySQL ne prend pas en charge les contraintes Check, mais vous pouvez utiliser les contraintes Check sans aucun effet Affichez un tableau déjà de contraintes
:# nom de la base de données information_schema (bibliothèque système)
_# Nom de la table Table_constraints (spécialement stocké les contraintes de chaque table)
SELECT *
FROM information_schema.table_constraints WHERE nom_table =
'Nom de la table' ; 2. Contrainte non nulle (NOT NULL)
2.1 FonctionLa valeur d'une certaine colonne ne peut pas être vide 2.2 Mot clé
NON NULL2.3 Fonctionnalités
à
1-- 1. Par défaut, tous les types de valeurs peuvent être NULL, y compris INT , FLOAT et autres types de données
2. La contrainte non nulle ne peut apparaître que sur les colonnes de l'objet table. Seule une certaine colonne peut être limitée à non nulle seule, et les non nulles ne peuvent pas être combinées.
(uniquement des contraintes au niveau des colonnes, pas de contraintes au niveau des tables)3. Une table peut avoir de nombreuses colonnes qui sont respectivement restreintes pour être non nulles
4. La chaîne vide ''
n'est pas égale à NULL, et 0 n'est pas égale à NULL 2.4 Ajouter une contrainte non nulle
2.4. 1 Lorsque CREATE TABLE Ajoutez une contrainte non nulle Format de grammaire :CREATE TABLE 表名称( 字段名 数据类型, 字段名 数据类型 NOT NULL, 字段名 数据类型 NOT NULL );
2.4.2 Ajoutez une contrainte non nulle lorsque ALTER TABLE
Format de grammaire :alter table 表名称 modify 字段名 数据类型 not null ;
语法格式: 举例: 用来限制某个字段/
某列的值不能重复。
UNIQUE 1.同一个表可以有多个唯一约束。 2.唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。 3.唯一性约束允许列值为空。并且允许存在多个NULL值。 4.在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。 5.MySQL会给唯一约束的列上默认创建一个唯一索引。 语法格式: 1.列级约束
2.表级约束
举例: 语法格式: 注:字段列表中如果是一个字段,表示该列的值唯一。如果是两个或更多个字段,那么复合唯一,即多个字段的组合是唯一的 举例:
语法格式: 1.在 create table 时添加复合唯一约束 2. 在 alter table 时添加复合唯一约束 字段列表中写的是多个字段名,多个字段名用逗号分隔,表示那么是复合唯一,即多
个字段的组合是唯一的 举例:
1.添加唯一性约束的列上也会自动创建唯一索引。
2.删除唯一约束只能通过删除唯一索引的方式删除。
3.删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
4.如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;
如果是组合列,那么默认和() 中排在第一个的列名相同。
也可以是自定义唯一性约束名。 语法格式: 查看表从索引:
举例:
用来唯一标识表中的一行记录。 primary key 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。
1. 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。
2. 主键约束对应着表中的一列或者多列(复合主键)
3. 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
4. MySQL的主键名总是
PRIMARY
,就算自己命名了主键约束名也没用。
5. 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的
主键索引
(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
6. 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性 语法格式:
1.列级模式
2.表级模式(注:
MySQL的主键名总是
PRIMARY
,就算自定义了主键约束名也没用
)
举例:
多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。 语法格式: 字段1和字段2的组合是唯一的,也可以有更多个字段 举例: 字段列表可以是一个字段,也可以是多个字段,如果是多个字段的话,是复合主键 语法格式: 举例:
删除主键约束,不需要指定主键名,因为一个表只有一个主键,
删除主键约束后,非空还存在。
(但在实际开发中,不会去删除表中的主键约束) 语法格式:
举例:
某个字段的值自增 auto_increment
1. 一个表最多只能有一个自增长列
2. 当需要产生唯一标识符或顺序值时,可设置自增长
3. 自增长列约束的列必须是键列(主键列,唯一键列)
4. 自增约束的列的数据类型必须是整数类型
5. 如果自增列指定了 0 和 null,会在当前最大值的基础上自增;如果自增列手动指定了具体值,直接 赋值为具体值 语法格式: 举例:
非法创建: 正确创建方式: 插入数据: 特殊情况(不推荐此写法): 语法格式: 举例:
语法格式: 举例:
在MySQL 8.0
之前,自增主键
AUTO_INCREMENT
的值如果大于
max(primary key)+1
,在
MySQL
重启后,会重 置AUTO_INCREMENT=max(primary key)+1
,这种现象在某些情况下会导致业务主键冲突或者其他难以发 现的问题。 下面通过案例来对比不同的版本中自增变量是否持久化。 案例:
对于MySQL5.7版本: 然后重启MySQL57服务器:(以管理员的身份运行) Il ressort des résultats que le 0 nouvellement inséré
La valeur attribuée est
4
, selon la logique de fonctionnement avant le redémarrage, il doit être alloué ici
6
. La principale raison des résultats ci-dessus est que la clé primaire à incrémentation automatique n'est pas conservée.
Dans le système MySQL 5.7, les règles d'allocation pour les clés primaires à incrémentation automatique sont les suivantes
InnoDB
Un dans le dictionnaire de données
Comptoir
décider, et le compteur est seulement en
Maintenance en mémoire
, ne sera pas conservé sur le disque. Ce compteur sera initialisé au redémarrage de la base de données. Pour la version MySQL8.0 :
Redémarrez ensuite le serveur MySQL80 : (exécutez en tant qu'administrateur) Il ressort des résultats que la variable auto-incrémentée a été conservée.
MySQL 8.0 persiste le compteur de la clé primaire auto-incrémentée
Refaire le journal
milieu. Chaque fois qu'un compteur change, il est écrit dans le journal de rétablissement. Si la base de données est redémarrée, InnoDB
La valeur de la mémoire du compteur sera initialisée en fonction des informations contenues dans le journal redo. Limiter l'intégrité référentielle d'un champ dans une table.
CLÉ ÉTRANGÈRE Table principale (table parent) : table référencée, table référencée
) Depuis la table (sous-table) : Pour citer la table des autres, référez-vous à la table des autres. Par exemple, la valeur du département de l'employé doit faire référence à la table des départements : La table des départements est la table principale, et la table des employés est la table.
IN IN , IN IN , IN INFO IN GUEST IN GUIDE GUEST POUR ÉLIRE DANS LA TABLE DES ÉTUDIANTS dans l'APP à inclure dans l'APP. 6.4 Fonctionnalités 1. À partir de la colonne clé étrangère du tableau,
Doit référencer/référencer la clé primaire ou la colonne de contrainte unique de la table principale
参 Parce que la valeur dépendante/référence doit être la seule 3. Si vous spécifiez des contraintes de clé étrangère lors de la création (CREATE) d'une table, créez d'abord la table maître, puis créez la table esclave 4. Lors de la suppression d'une table, supprimez d'abord la table esclave (ou supprimez d'abord les contraintes de clé étrangère ), puis supprimez la table maître 5. Lorsque les enregistrements de la table maître sont référencés par la table esclave, les enregistrements de la table maître ne seront pas supprimés. Si vous souhaitez supprimer les données, vous devez le faire. supprimez d'abord les données qui dépendent de l'enregistrement de la table esclave, puis vous pouvez supprimer les données de la table maître 6. Spécifiez les contraintes de clé étrangère dans la "table esclave", et une table peut établir plusieurs contraintes de clé étrangère 7. 从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义一致。如果类型不一样,创建子表时,就会出现错误。 8.
当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是外键的约束名。(根据外键查询效率很高) 9. 删除外键约束后,必须 手动 删除对应的索引 语法格式: -- FOREIGN KEY: 在表级指定子表中的列
-- REFERENCES: 标示在父表中的列 (从表的某个字段)的数据类型必须与主表名(被参考字段)的数据类型一致,逻辑意义也一样
(从表的某个字段)的字段名可以与主表名(被参考字段)的字段名一样,也可以不一样 举例:
正确的创建方式: 错误的创建方式: 添加数据: 修改数据: 删除数据: 一般情况下,表与表的关联都是提前设计好了的,因此,会在创建表的时候就把外键约束定义好。不过,如果需要修改表的设计(比如添加新的字段,增加新的关联关系),但没有预先定义外键约束,那么,就要用修改表的方式来补充定义。 语法格式: 1. Cascade
方式
:在父表上
update/delete
记录时,同步
update/delete
掉子表的匹配记录
2. Set null方式
:在父表上
update/delete
记录时,将子表上匹配记录的列设为
null
,但是要注意子 表的外键列不能为not null
3. No action方式
:如果子表中有匹配的记录,则不允许对父表对应候选键进行
update/delete
操作
4 .Restrict方式 (默认)
:同no action
, 都是立即检查外键约束
5. Set default方式
(在可视化工具
SQLyog
中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb
不能识别 如果没有指定等级,就相当于Restrict方式。
对于外键约束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式。 举例:(以 on update cascade on delete set null
为例)
1.创建表 2.添加数据 3.修改数据 4.删除数据 流程如下: (1)第一步先查看约束名和删除外键约束
(
2)第二步查看索引名和删除索引。(注意,只能手动删除)
#查看某个表的索引名
注意: 删除外键约束后,必须 手动 删除对应的索引 举例:
问题
1
:如果两个表之间有关系(一对一、一对多),比如:员工表和部门表(一对多),它们之间是否
一定要建外键约束?
答:不是的 问题
2
:建和不建外键约束有什么区别?
答:建外键约束,你的操作(创建表、删除表、添加、修改、删除)会受到限制,从语法层面受到限制。
例如:在员工表中不可能添加一个员工信息,它的部门的值在部门表中找不到。 不建外键约束,你的操作(创建表、删除表、添加、修改、删除)不受限制,要保证数据的
引用完整 性
,只能依
靠程序员的自觉
,或者是
在
Java
程序中进行限定
。例如:在员工表中,可以添加一个员工的信息,它的部门指定为一个完全不存在的部门。 问题
3
:那么建和不建外键约束和查询有没有关系?
答:没有 拓展: 在 MySQL
里,外键约束是有成本的,需要消耗系统资源。对于大并发的
SQL
操作,有可能会不适 合。比如大型网站的中央数据库,可能会
因为外键约束的系统开销而变得非常慢
。所以,
MySQL
允 许你不使用系统自带的外键约束,在
应用层面
完成检查数据一致性的逻辑。也就是说,即使你不 用外键约束,也要想办法通过应用层面的附加逻辑,来实现外键约束的功能,确保数据的一致性。 【 强制 】不得使用外键与级联,一切外键概念必须在应用层解决。 说明:(概念解释)学生表中的 student_id 是主键,那么成绩表中的
student_id
则为外键。如果更新学 生表中的 student_id
,同时触发成绩表中的
student_id
更新,即为级联更新。外键与级联更新适用于
单机低并发
,不适合
分布式
、
高并发集群
;级联更新是强阻塞,存在数据库
更新风暴
的风险;外键影响 数据库的
插入速度
。 检查某个字段的值是否符号xx
要求,一般指的是值的范围 CHECK MySQL5.7 可以使用
check约束,但check约束对数据验证没有任何作用。添加数据时,没有任何错误或警告。
MySQL 8.0中可以使用check约束了
。 给某个字段/
某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。 DEFAULT 语法格式: 方式1:
方式2:
说明:默认值约束一般不在唯一键和主键列上加 举例:
语法格式: 注: 1.如果这个字段原来有非空约束,你还保留非空约束,那么在加默认值约束时,还得保留非空约束,否则非空约束就被删除了。 2.同理,在给某个字段加非空约束也一样,如果这个字段原来有默认值约束,你想保留,也要在modify语句中保留默认值约束,否则就删除了。 举例:
语法格式: 1.删除默认值约束,也不保留非空约束 2.删除默认值约束,保留非空约束
举例:
面试
1
、为什么建表时,加
not null default ''
或
default 0
答:不想让表中出现null
值。 面试
2
、为什么不想要
null
的值
答:
(1)不好比较。
null
是一种特殊值,比较时只能用专门的
is null
和
is not null
来比较。碰到运算符,通常返回null
。
(2)效率不高。影响提高索引效果。因此,我们往往在建表时 not null default ''
或
default 0 面试
3
、带
AUTO_INCREMENT
约束的字段值是从
1
开始的吗?
在MySQL
中,默认AUTO_INCREMENT的初始 值是1,每新增一条记录,字段值自动加1
。设置自增属性(AUTO_INCREMENT)的时候,还可以指定第 一条插入记录的自增字段的值,这样新插入的记录的自增字段值从初始值开始递增,如在表中插入第一 条记录,同时指定id
值为
5
,则以后插入的记录的
id
值就会从
6
开始往上增加。添加主键约束时,往往需要 设置字段自动增加属性。 面试
4
、并不是每个表都可以任意选择存储引擎?
外键约束(
FOREIGN KEY) ne peut pas être utilisé sur tous les moteurs. (Le moteur utilisé par la table maître et la table esclave doit être le même)
多 MySQL prend en charge une variété de moteurs de stockage. Chaque table peut spécifier un moteur de stockage différent. Il convient de noter que la contrainte de clé externe est utilisée pour garantir l'intégrité de référence des données. Si la clé externe doit être associée entre les tables, it Si différents moteurs de stockage sont spécifiés, des contraintes de clé étrangère ne peuvent pas être créées entre ces tables. Le choix du moteur de stockage n’est donc pas totalement arbitraire. Apprentissage recommandé : 2.5 删除非空约束
1.alter table
表名称 modify 字段名 数据类型 NULL; #去掉not null,相当于修改某个非注解字段,该字段允 许为空
2.alter table 表名称 modify 字段名 数据类型; #去掉not null,相当于修改某个非注解字段,该字段允许为空
3. 唯一性约束(UNIQUE 或 UNIQUE KEY)
3.1 作用
3.2 关键字
3.3 特点
3.4 添加唯一约束
3.4.1 在CREATE TABLE 时添加唯一约束
create table
表名称(
字段名 数据类型,
字段名 数据类型 unique,
字段名 数据类型 unique key,
字段名 数据类型
);
create table
表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
[constraint 约束名] unique key(字段名)
);
3.4.2 在ALTER TABLE 时添加唯一约束
1. alter table 表名称
add [constraint 约束名] unique key(字段列表);
2. alter table 表名称
modify 字段名 字段类型 unique;
3.4.3 添加复合唯一性约束
create table 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
[constraint 约束名] unique key(字段列表)
);
alter table 表名称
add [constraint 约束名] unique key(字段列表);
3.5 删除唯一约束
ALTER TABLE USER
DROP INDEX 约束名;
show index from 表名称
;
4. PRIMARY KEY 约束(主键约束)
4.1 作用
4.2 关键字
4.3 特点
4.4 添加主键约束
4.4.1 在CREATE TABLE 时添加主键约束
create table 表名称(
字段名 数据类型 primary key, #列级模式
字段名 数据类型,
字段名 数据类型
);
create table 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
[constraint 约束名] primary key(字段名) #表级模式
);
4.4.2 在CREATE TABLE 时添加复合主键约束
create table
表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
primary key(字段名1,字段名2)
);
4.4.3 在 ALTER TABLE 时添加(复合)主键约束
1. ALTER TABLE 表名称 MODIFY 字段名 数据类型 PRIMARY KEY;
2. ALTER TABLE 表名称 ADD PRIMARY KEY(字段列表);
4.5 删除主键约束
alter table 表名称
drop primary key;
5. 自增列:AUTO_INCREMENT
5.1 作用
5.2 关键字
5.3 特点和要求
5.4 添加自增约束
5.4.1 在CREATE TABLE 时添加自增约束
create table
表名称(
字段名 数据类型 primary key auto_increment,
字段名 数据类型 ,
字段名 数据类型 ,
字段名 数据类型
);
create table 表名称(
字段名 数据类型 ,
字段名 数据类型 unique key auto_increment,
字段名 数据类型
);
5.4.2 在 ALTER TABLE 时添加自增约束
alter table
表名称
modify 字段名 数据类型 auto_increment;
5.5 删除自增约束
alter table 表名称 modify 字段名 数据类型;
5.6 MySQL 8.0新特性—自增变量的持久化
6. Contrainte FOREIGN KEY
6.1 Fonction
6.2 Mots clés
6.3 Table principale et table esclave/table parent et table enfant
2. Lors de la création d'une contrainte de clé externe, si la clé externe n'est pas restreinte, le nom par défaut n'est pas une liste, mais génère automatiquement un nom de clé externe (tel que Student_ibfk_1_1 ;), vous pouvez également spécifier le nom de la contrainte de clé étrangère.
6.5 添加外键约束
6.5.1 在 create table 时添加外键约束
create table
主表名称(
字段1 数据类型 primary key,
字段2 数据类型
);
create table 从表名称(
字段1 数据类型 primary key,
字段2 数据类型,
[CONSTRAINT <外键约束名称>] FOREIGN KEY(从表的某个字段) references 主表名(被参考字段) [on update xx][on delete xx];
);
6.5.2 在ALTER TABLE 时添加外键约束
ALTER TABLE 从表名
ADD [CONSTRAINT 约束名] FOREIGN KEY (从表的字段) REFERENCES 主表名(被引用 字段) [on update xx][on delete xx];
6.7 约束等级(级联)
6.8 删除外键约束
#查看某个表的约束名
SELECT * FROM information_schema.table_constraints
WHERE table_name = '表名称';
ALTER TABLE 从表名
DROP FOREIGN KEY 外键约束名;
SHOW INDEX FROM 表名称;
ALTER TABLE 从表名 DROP INDEX 索引名;
6.9 开发场景
6.10 阿里开发规范
7. CHECK 约束
7.1 作用
7.2 关键字
7.3 说明:MySQL 5.7 不支持
7.4 添加CHECK 约束
8. DEFAULT约束
8.1 作用
8.2 关键字
8.3 添加默认值约束
8.3.1 在 CREATE TABLE时添加默认值约束
create table
表名称(
字段名 数据类型 primary key,
字段名 数据类型 unique key not null,
字段名 数据类型 unique key,
字段名 数据类型 not null default 默认值,
);
create table
表名称(
字段名 数据类型 default 默认值 ,
字段名 数据类型 not null default 默认值,
字段名 数据类型 not null default 默认值,
primary key(字段名),
unique key(字段名)
);
8.3.2 在 ALTER TABLE时添加默认值约束
alter table
表名称 modify 字段名 数据类型 default 默认值;
alter table 表名称 modify 字段名 数据类型 default 默认值 not null
;
8.4 删除默认值约束
alter table
表名称 modify 字段名 数据类型 ;
alter table
表名称 modify 字段名 数据类型 not null
;
9. 面试
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!