飞不高 发表于 2025-1-22 00:20:05

MySQL -- 束缚

1. 数据库束缚

数据库束缚时关系型数据库的一个告急功能,重要的作用是保证数据的有效性,也可以明白为数据的精确性(数据本身是否精确,关联关系是否精确) **人工查抄数据的完整性工作量非常大,在数据库中定义一些束缚,那么数据在写入数据库的时间,就会帮我们做一些校验.**并且束缚一般是在指定列上创建的.
2. 束缚范例

范例
阐明
NOTNULL空束缚 (常用)
指定空束缚的列不能存储NULL值
DEFALUT默认束缚(常用)
当没有给列赋值时使的默认值
UNIQUE唯束缚(常用)
指定唯束缚的列每数据必须有唯的值
PRIMARYKEY主键束缚(常用)
NOTNULL和UNIQUE的结合,可以指定个列或多个列,有助于防数据重复和提数据的查询性能
FOREIGNKEY外键束缚(现在不用)
外键束缚是种关系束缚,于定义两个表之间的关联关系,可以确保数据的完整性和致性
CHECK束缚 (不用)
于限制列或数据在数据库表中的值,确保数据的精确性和可靠性
3. NOTNULL空束缚

定义表时某列不允许为NULL时,可以为列添加空束缚。


[*]如创建个学表,学名为NULL时,这条记录是不完整的
https://i-blog.csdnimg.cn/direct/cfac91557368440199c63599e658d8a3.png
https://i-blog.csdnimg.cn/direct/043533da408548818166152756cb25a0.png


[*]此时必要束缚学名的列不能为NULL
https://i-blog.csdnimg.cn/direct/f53793338c7742eb93cfd1f2a906d88b.png
https://i-blog.csdnimg.cn/direct/ab3b739476af4825a20ecb38840f0818.png


[*]由于name列有空束缚,插NULL值时报错,但插入name的精确值就能通过
https://i-blog.csdnimg.cn/direct/84eb86c99cfc4fb282fc84c86c206089.png


[*]检察表结构,NULL列为NO表值不允许为NULL,YES表值可以为NUL
https://i-blog.csdnimg.cn/direct/cf6c3a4f54b7444289040b14ec225b2a.png
4. DEFALUT默认值束缚

   DEFAULT束缚于向列中插默认值,如果没有为列设置值,那么会将默认值设置到该列.


[*]首先我们创建一个表,新增年岁列
示例:
https://i-blog.csdnimg.cn/direct/45abd89386be4090be735c25124eb3ab.png


[*] 我们盼望插入进来的数据,没有给定年岁时,会默认有年岁,那么我们重构弟子表,为年岁加入默认束缚在要加束缚的列名后直接加default默认值即可
create table family (
id bigint,
name varchar(20) NOT NULL,
age int default 18
);
[*] 插条记录,不指定年岁的值时列使了默认值
https://i-blog.csdnimg.cn/direct/cbba8cb09405407a9a8c7149ce7c1b78.png


[*]检察表结构,年岁列的默认值为18
https://i-blog.csdnimg.cn/direct/781ab290a1bd45169c8d952625fde727.png


[*]当我们插入年岁列为NULL时,是否默认值还是18?但当动明白指年岁列为NULL时列值为NULL,不会使用默认值
https://i-blog.csdnimg.cn/direct/e5f15358584b476589db567a19812556.png
5. UNIQUE唯束缚

   指定了唯束缚的列,该列的值在全部记录中不能重复,如个的份证号,学的学号等


[*] 重构弟子表,id列后增长唯一束缚
drop table if exists student;
create table student2 (
id bigint UNIQUE,
name varchar(20) not null
);
[*] 我们发现不设置唯一束缚时,id可以重复
https://i-blog.csdnimg.cn/direct/c562b403e90d4e42b54c2f10736521de.png


[*] 我们发现为id列添加唯一束缚后,相同的则不能插入进去,唯一束缚生效https://i-blog.csdnimg.cn/direct/4c6bedeedb444a01b32c044a02d2d182.png
[*] 在id列添加 UNIQUE关键字,为 id 设置唯一束缚; 检察表结构,Key列显UNI表唯束缚
https://i-blog.csdnimg.cn/direct/79e94617da244133bd63c916e3fe0491.png
[*] 但当插入NULL值时,依旧可以插入
https://i-blog.csdnimg.cn/direct/87290718daeb41e1925ea332c9001627.png
6. PRIMARYKEY主键束缚

主键束缚唯标识数据库表中的每条记录。
主键必须包罗唯的值,且不能包罗NULL值。
每个表只能有个主键,可以由单个列或多个列组成。
通常为每张表都指定个主键,主键列建议使BIGINT范例


[*] 重构学表,为ID列添加空和唯束缚
drop table student;
create table student (
id bigint not null unique,
name varchar(20) not null,
age int DEFAULT 18,
sno varchar(10) UNIQUE
);
[*] 检察表结构,添加了空和唯束缚之后Key列显PRI表主键
今后处我们可以知道 PRIMARY KEY= NOT NULL + UNIQUEhttps://i-blog.csdnimg.cn/direct/c0efd2d4aca4465ebc062e05f62183e5.png
[*] 当Id列的值重复时会发主键冲突
https://i-blog.csdnimg.cn/direct/d0c40b431c5f486daa923413b70aed42.png
[*] 通常把主键列设置为动增(auto_increment),让数据库维护主键值 PRIMARY KEY auto_increment
https://i-blog.csdnimg.cn/direct/9275a27245724b6ea162c538d2aadde0.png
[*] 插数据时不设置主键列的值
https://i-blog.csdnimg.cn/direct/11865b269c394e0eaaa37d044ce5bd6b.png
上图中我们插错了一条数据,那我们的自增主键id会走到什么位置?2还是3 接着我们检察一下,此时发现id是从3开始的,这是为何?由于在数据库中插入数据精确或错误,自增主键都会向下走一步,不会回退,如许可以提高查询效率。
https://i-blog.csdnimg.cn/direct/829f2c4eb0ca4446b521d81f7be713db.png


[*] 检察表结构,Extra列显auto_increment表增
https://i-blog.csdnimg.cn/direct/d77dd3fc4bb348deb707a018637d3d24.png
[*] 主键值是自增的,那么是否可以不连续呢?此时我们插入主键值为100的数据,我们发现插入成功,以是主键值可以不连续。
https://i-blog.csdnimg.cn/direct/da3f07e987ab4fc3a79143cce43fb037.png
[*] 那么我们发现,插入100主键值之后,自增主键将从哪里自增呢??我们发现:下一次自增从主键的最大值开始
https://i-blog.csdnimg.cn/direct/4613d8a421d24272847818f081c05adc.png
[*] 主键或唯键冲突时的更新利用,插否则更新
1.插入
https://i-blog.csdnimg.cn/direct/e2095d6bb7c54186838efbdf57e3a5c0.png
2.更新
可以使以上语法,如果插时有冲突则更新当前列的值, 两受影响,表删除了原来的记录,新写了条记录其与update student set name ='钱六',number='100011' where id=100;等效
https://i-blog.csdnimg.cn/direct/f04b87eb71b84e668f7211dd1243fc17.png
3.替换
如果表中没有冲突则直接插入新数据,和insert的功能是一样的。
https://i-blog.csdnimg.cn/direct/d6dc6f439b7940cbadb6f13486f7401c.png
https://i-blog.csdnimg.cn/direct/7aab4da970b74890b11e1e906a43496e.png


[*] 表中不能有多个主键
drop table student;
重构学?表

create table student (
id bigint PRIMARY KEY auto_increment, # 定义主键
name varchar(20) PRIMARY KEY
); # 定义主键
ERROR 1068 (42000): Multiple primary key defined # 报错
7. FOREIGNKEY外键束缚

外键于定义主表和从表之间的关系
外键束缚主定义在从表的列上,主表关联的列必须是主键或唯束缚
当定义外键后,要求从表中的外键列数据必须在主表的主键或唯列存在或为null。
7.1 语法

foreign key (id) references class(id)
https://i-blog.csdnimg.cn/direct/06115dc284854fd089c65bc7f1f50457.png
https://i-blog.csdnimg.cn/direct/00072eff2cd54ba7a81d01aa6de12462.png
https://i-blog.csdnimg.cn/direct/248328b0725746f488e982953d3ab060.png


[*] 删除主表某条记录时,从表中不能有对该记录的引
[*] 删除主表时要先删除从表
删除主表时,应该先排除主外键关系大概删除从表https://i-blog.csdnimg.cn/direct/710ffefbaba44bca8282970f3b81a4cc.png
8. CHECK束缚

可以应于个或多个列,于限制列中可接受的数据值,从确保数据的完整性和精确性。
在8.0.16开始全持CHECK束缚,之前的版本会忽略CHECK的定义
但是注意,一般在应用步伐级别校验


[*] 重构学表,有以下要求,年岁不能于16岁,性别只能是男或
create table student(
id bigint PRIMARY KEY auto_increment, #设置?增主键
name varchar(20) not null,
age int DEFAULT 18,
gender char(1),
check (age >= 16),
check (gender = ‘男’ or gender = ‘?’)
);
[*] c1的值不能为0,c2的值必须于0,c3的值不于c2
create table t_check (
c1 int check(c1 <> 0),
c2 int check(c2 > 0),
c3 int,
check(c3 >= c2)
);

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: MySQL -- 束缚