当前位置:网站首页>关系型数据库-MySQL:约束管理、索引管理、键管理语句
关系型数据库-MySQL:约束管理、索引管理、键管理语句
2022-08-04 05:26:00 【focus_lyh】
简述
关系型数据库中的数据约束,可以理解为向数据表中插入数据时要遵守的限制规则。mysql 中的常用约束有主键约束、唯一键约束、外键约束、非空约束等,我们先列出其概念。
主键:primary key,表上一个或多个字段的组合,填入主键字段中的数据,必须不同于已经存在的其它行的相同字段上的数据,而且也不能为空;一个表只能存一个主键,一个主键可以由多个字段组成;
唯一键:unique key,表上一个或多个字段的组合,填入其中字段中的数据,必须不同于已经存在的其它行的相同字段上的数据,但可以为空;一个表可以有多个唯一键;
外键:foreign key,一个表中的外键字段中所能够插入的数据取值范围,取决于引用的另一个表上主键字段上的已经存在数据集合;
检查条件约束:check,自定义的逻辑表达式;
下面练习到的约束在创建表的时候就可以被定义(参考表管理语句),此处只列出如何为已经存在的字段添加、删除、修改约束。注意,在创建主键约束,唯一键约束的时候,会自动创建对应的索引。
一、非空约束
添加非空约束:为 testtb 表中的 name 字段添加非空约束
alter table testtb modify name varchar(100) not null;
删除非空约束:去除非空约束只要将字段修改为可以为空即可,注意,如果字段有其他约束,不要忘了加在语句的后面
alter table testtb modify name varchar(100) null;
二、自动增长
添加自动增长:为 testtb 表的 id 字段设置自动增长。
alter table testtb modify id int auto_increment;
# 或者
alter table testtb change id id int auto_increment;
删除自动增长:
alter table testtb change id id int;
# 或者
alter table testtb modify id int;
三、主键约束
添加主键约束:将 testtb4 中的 id 字段指定为表的主键
alter table testtb4 add primary key(id);
# 或者
alter table testtb4 add constraint primary key(id);
删除主键约束:
注意:如果对应的主键上存在自动增长,则不能直接删除主键,需先删除自动增长后,然后再删除主键。同理,如果当前表的主键已经被其他表中的字段当做外键,那么则需要先删除其他表中的主外键关系,才能删除当前主键。
alter table testtb drop primary key;
四、唯一键约束
添加唯一键约束
添加唯一键约束,唯一键的名称默认为字段名称,如果对一个字段重复创建唯一键,唯一键名称将会按照创建时的序号依次向后增加,但是针对同一个字段重复创建唯一键是没有任何意义的,也强烈不建议这样做。
alter table testtb add unique key(uid);
在创建唯一键的时候,可以指定唯一键的名称,例如,指定唯一键的名称为uni_test。
alter table testtb add unique key uni_test(test);
删除唯一键约束
注意,删除唯一键时使用的是 index 关键字。
alter table testtb drop index uni_test;
五、查看约束
查看主键 / 查看唯一键 /查看外键:显示出 test1 表中的主键信息、唯一键信息以及外键信息,也就是说 test1 表的所有键信息(不包含纯索引 index 信息)都会显示出来。
select * from information_schema.key_column_usage where table_name='test1';
查看主键:
desc test1
查看主外键对应关系:不想查看主键,只想查看特定表的外键。比如查看 test1 这张表中引用了哪些表中的主键作为自己的外键。也可以理解为查看test1表的外键。
select TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
from information_schema.KEY_COLUMN_USAGE
where TABLE_NAME = 'test1' and REFERENCED_TABLE_NAME is not null;
查看test2这张表的主键被哪些表引用成为了外键,可以与上一个示例对比查看。
select REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME,CONSTRAINT_NAME,TABLE_NAME,COLUMN_NAME
from information_schema.KEY_COLUMN_USAGE
where REFERENCED_TABLE_NAME = 'test2';
六、外键约束
添加外键约束:在 testtb 表中创建一个新的字段,tid,并且添加了一个外键,外键的名称叫 testtb_tid_fk,外键中, testtb 表中的 tid 字段引用了表 testtb2 表中的 id 字段。
alter table testtb add column tid int default 0 not null;
alter table testtb add constraint testtb_tid_fk foreign key(tid) references testtb2(id);
删除外键约束:如果想要删除外键,必须先查询到对应外键的名称,才能去除外键,使用”查看主外键对应关系”中的方法,可以查看某张表中的所有外键,找到对应的外键名称后,根据外键名称删除即可。例如,先查询到 test4 表中的外键有哪些,可能有多个,找到对应的外键名称,比如外键 test_tid_fk。
select TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
from information_schema.KEY_COLUMN_USAGE
where TABLE_NAME = 'test4' and REFERENCED_TABLE_NAME is not null;
删除test4表中的 test_tid_fk 外键。
alter table test4 drop foreign key test_tid_fk;
七、索引管理
添加一个索引/创建一个纯粹的索引
这里所说的纯粹的索引指的就是index,不是unique index,只是单纯的index,使用如下语句表示为testtb表的name字段添加一个单纯的索引,索引的名字为ind_name。
alter table testtb add index ind_name(name);
当我们使用上述语句添加索引以后,使用show index from testtb;可以查看到对应的索引,但是在information_schema.KEY_COLUMN_USAGE 表中将不会存在同名的”约束”,而当我们创建一个唯一键或者唯一索引的时候,不仅能在information_schema.KEY_COLUMN_USAGE表中看到对应名称的”约束”,同时还能使用show index from testtb;查看到对应名称的索引,这就体现了”键/约束”与”索引”的不同,当我们创建一个约束的时候,会创建对应的索引,但是如果只是创建一个单纯的索引,”纯index”,那么它则只是一个”索引”罢了。
我们还可以使用另外一种语法创建索引,语法如下。
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [using index_type] ON tbl_name (index_col_name,…)
上述语法中,我们可以指定创建哪种特殊索引,也可以只使用index,表示创建一个纯索引,[using index_type]表示索引类型,可省略,省略后默认使用btree类型的索引,并且指明在哪个表的哪个字段上创建索引。index_col_name用于指明字段名称,示例如下,如下语句表示在testtb表的name字段上创建一个索引,索引的名称为ind_name,索引的长度为20(注意,20并不是表示name字段的长度,假如name字段长度为100,此处指定20表示取出name字段的左边开头的头20个字节作为索引),索引为降序排列,不指定desc时默认以升序排序。
create index ind_name on testtb (name(20) desc);
create index ind_name on testtb (name(20));
create index ind_name on testtb (name);
如下示例语句表示创建一个联合索引。
create index ind_id_name on testtb1 (id,name);
create index ind_id_name on testtb1 (id,name(20));
重建索引
数据库长时间运行后,索引会有损坏的可能,这个时候,重建索引,可以提高数据的检索速度,所以,重建索引的操作在平常的维护工作中可能会被用到,不过mariadb中的innodb存储引擎不支持重建索引。
alter table test2 drop index uu_ttt;
查看索引
查看testtb表中的所有索引
show index from testtb;
根据索引名称,查看testtb表中的部分索引,如下语句表示查看testtb表中以ind开头的索引。
show index from testtb where key_name like 'ind%';
边栏推荐
猜你喜欢

C language -- operator details

DP4398:国产兼容替代CS4398立体声24位/192kHz音频解码芯片

scrapy 爬取当当图书名字图片

实际开发中左菜单自定义图标点击切换

8. Custom mapping resultMap

The cost of automated testing is high and the effect is poor, so what is the significance of automated testing?

登录页面js手写

EntityComponentSystemSamples学习笔记

7.18 Day23----标记语言

嵌入式系统驱动初级【4】——字符设备驱动基础下_并发控制
随机推荐
Unity DOTS学习教程汇总
梳理CamStyle、PTGAN、SPGAN、StarGAN
谷粒商城-基础篇(项目简介&项目搭建)
DP4398:国产兼容替代CS4398立体声24位/192kHz音频解码芯片
JNI基本使用
Unity行为树AI分享
EventBus源码分析
Web Basics and Exercises for C1 Certification - My Study Notes
字符串常用方法
9、动态SQL
大龄程序员的心理建设
Summary of MySQL database interview questions (2022 latest version)
JS basics - forced type conversion (error-prone, self-use)
处理List<Map<String, String>>类型
强制结束进程
实际开发中左菜单自定义图标点击切换
MySQL日期函数
实际开发中,客户要求密码输入框禁止粘贴~
string类简介
12、分页插件