目录
MySQL 键值概述
键值类型
索引介绍
索引优缺点
MySQL 键值使用
Index 普通索引
primary key主键
foreign key外键
首页 数据库 mysql教程 详细介绍MySQL键值(整理总结)

详细介绍MySQL键值(整理总结)

Feb 24, 2022 pm 05:30 PM
mysql

本篇文章给大家带来了关于mysql中键值的相关知识,其中包括了键值类型、索引介绍、索引优缺点以及mysql键值使用的相关问题,希望对大家有帮助。

详细介绍MySQL键值(整理总结)

推荐学习:mysql视频教程

MySQL 键值概述

键值类型

  • 根据数据存储要求,选择键值

    • index               普通索引

    • unique             唯一索引

    • fulltext             全文索引

    • primary key     主键

    • foreign key      外键

索引介绍

  • 索引是什么?

—— 类似于书的目录

—— 对表中字段进行排序

—— 索引类型包括:Btree(二叉树)、B+tree、hash

索引优缺点

  • 索引有点

—— 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性

—— 可以加快数据的查询速度

  • 索引缺点

—— 但对表中的数据进行增加、删除和修改的时候,索引也要动态的调整,降低了数据的维护速度

—— 索引需要占物理空间

MySQL 键值使用

Index 普通索引

  • 使用规则

—— 一个表中可以有多个 index 字段

—— 字段的值允许重复,且可以赋 NULL 值

—— 通常把做为查询条件的字段设置为 index 字段

—— index 字段标志为 MUL

  • 建表时创建索引

—— index(字段名), index(字段名) .. ..

mysql> create table 库名.表名(
             字段列表,
             index(字段名),
             index(字段名)
             );
登录后复制

创建一个信息表,指定字段中的name和age作为索引(字段name和age中的值要进行排序)

mysql> create table db2.t2(
-> name char(10),
-> age int,
-> class char(7),
-> email char(30),
-> index(name),index(age)
-> );
mysql> desc db2.t2;
登录后复制

  • 查看索引信息

    • 基本查看

—— desc 库名.表名;      //查看key那一列
登录后复制
    • 详细查看

—— show index from 表名 \G;
mysql> show index from db2.t2 \G     //因为有两个字段作为索引,所以下面有两列,\G以列的形式展现输出的结果
登录后复制

mysql> show index from db2.t2; //下图是不加 \G 的效果

  • 删除索引

—— drop index 索引名 on 库名.表名;

mysql> drop index age on db2.t2; //删除索引age
mysql> desc db2.t2;
登录后复制

mysql> show index from db2.t2 \G //只剩下索引name,索引age已被删除

向库db2中的表t2中存入数据:

mysql> insert into db2.t2 values("bob",19,"B180601","stu1@163.com");
mysql> insert into db2.t2 values("tom",19,"B180602","stu2@163.com");
mysql> insert into db2.t2 values("lucy",19,"B180603","stu3@163.com");
mysql> insert into db2.t2 values("jack",19,"B180604","stu4@163.com");
mysql> select * from db2.t2;       //表中的数据显示是按照插入表记录的顺序排进行排序的
登录后复制

索引排序的信息在 t2.frm 和 t2.ibd 文件中

[root@DB ~]# ls /var/lib/mysql/db2

注:没有设置索引的时,查询表数据是按照表顺序逐行进行匹配的;设置索引后,是按照索引的排序来进行查找的(如:BTree、B+Tree、hash)

  • 在已有的表里创建索引

—— create index 索引名 on 表名(字段名);

mysql> use db2;
mysql> show tables;
登录后复制

mysql> desc db2.stuinfo;

mysql> create index name on db2.stuinfo(name);     //索引名一般情况和字段名一样,索引名也可以用别的名字
mysql> desc db2.stuinfo;
登录后复制

mysql> show index from db2.stuinfo \G; //查看索引的详细信息

primary key主键

  • 使用规则

—— 字段值不允许重复,且不允许赋NULL值

—— 一个表中只能有一个primary key字段

—— 多个字段都作为主键,称为复合主键,必须一起创建

—— 主键字段的标志是PRI

—— 主键通常与 auto_increment 连用

—— 通常把表中唯一标志记录的字段设置为主键

[记录编号字段]

  • 建表时创建主键

—— primary key(字段名)

mysql> create table t8(
             name char(5) primary key,
             id int
             );
登录后复制

格式一:

mysql> create table db2.t3(name char(10) primary key,age int);     //设置name字段为主键,但设置完主键后,自动将约束条件是否为空设置为NO(即不允许为空)
mysql> desc db2.t3;
登录后复制

格式二:

mysql> create table db2.t4(name char(10),age int,primary key(name));     //也可以先将字段创建出来,最后在指定哪个字段为做主键
mysql> desc db2.t4;
登录后复制

向表t3中插入数据

mysql> insert into db2.t3 values("bob",19);
mysql> select * from t3;
登录后复制

mysql> insert into db2.t3 values("bob",21);      //错误原因,由于字段name是主键,所以字段name中的值不允许重复,表中name字段里面已经有个值为bob了,所以在向字段name赋值时就不能再赋bob值了
ERROR 1062 (23000): Duplicate entry 'bob' for key 'PRIMARY'
mysql> insert into db2.t3 values(null,21);     //报错原因,由于字段name是主键,所以字段name不允许赋NULL值
ERROR 1048 (23000): Column 'name' cannot be null
登录后复制
  • 在已有表里创建主键

—— 格式

mysql> alter table 库名.表名 add primary key(字段名);
mysql> desc db2.t2;
登录后复制

mysql> select * from db2.t2;

//我们要将字段name设置为主键,所以我们要检查原表中name字段的值,确保没有空(NULL)值和重复的值,如上图所示,表t2中name字段没有空值和重复的值,也可以通过下面的方法
mysql> select name from db2.t2 where name is null;      //查看name字段中的哪些值为空值,输出结果显示没有
Empty set (0.01 sec)
mysql> alter table db2.t2 add primary key(name);      //设置字段name为主键
mysql> desc db2.t2;
登录后复制

  • 删除主键

—— alter table 表名 drop primary key;

注:移除主键前,如果有自增属性,必须先去掉

  • 创建复合主键

—— alter table 表名 add primary key(字段名列表);

注:多个字段都作为主键时,称为复合主键,作为主键的这几个字段里的值,在插入记录时不能同时重复。比如字段class有两个值都为classA,字段name的两个值不能都为tom,即字段name中不能有一样的名字,可以为tom和lucy,但不能都为tom

创建复合主键,将class字段和name字段都设置为主键

mysql> create table db2.t5(
    -> class char(7),
    -> name char(10),
    -> money enum("no","yes"),
    -> primary key(class,name)
    -> );
mysql> desc db2.t5;
登录后复制

mysql> insert into db2.t5 values("B180601","bob","yes");
mysql> select * from db2.t5;
登录后复制

mysql> insert into db2.t5 values("B180601","bob","yes");     //报错原因,因为字段class和字段name都为主键,所以这两个字段的值不能同时重复
ERROR 1062 (23000): Duplicate entry 'B180601-bob' for key 'PRIMARY'
mysql> insert into db2.t5 values("B180602","bob","yes");     //两个主键字段,只要有一个字段的值没有重复,另外的主键字段不管重复没重复都可以插入
mysql> insert into db2.t5 values("B180602","tom","yes");
mysql> select * from db2.t5;
登录后复制

注:此时出现一个问题,若同一个班出现名字相同的两个人,然而class字段和name字段都为主键,由于这两个主键字段的值不能同时重复,此时数据是不能插入的。解决方案就是先删除这两个字段的主键,再删除表数据,然后在创建一个stu_num(学号)字段,设置stu_num、class、name字段一起做主键。

1)删除主键:

mysql> alter table db2.t5 drop primary key(name);     //错误原因,由于字段class和字段name一起作为主键,所以删除时不能只删除一个,必须同时删除
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(name)' at line 1      
mysql> desc db2.t5;      //发现主键已被删除
登录后复制

2)创建一个新字段stu_num:

mysql> alter table db2.t5 add stu_num char(9) first; //添加一个新字段stu_num,并放在表的第一列

mysql> select * from db2.t5; //由于要设置字段stu_num为主键,所以字段stu_num的值不能为NULL,所以我们要清空表数据

3)清空表数据:

mysql> delete from db2.t5;
mysql> select * from db2.t5;     //输出结果显示t5表为空表
Empty set (0.00 sec)
登录后复制

4)在已有表里创建复合主键:

mysql> alter table db2.t5 add primary key(stu_num,class,name);
mysql> desc db2.t5;
登录后复制

mysql> insert into db2.t5 values("B18060101","B180601","bob","yes");
mysql> insert into db2.t5 values("B18060102","B180601","bob","yes");
mysql> select * from db2.t5;      //三个字段都为主键,只要其中一个主键的值不重复,那么数据就能插入成功
登录后复制

//通过加入学号stu_num字段为,让三个字段都为主键,解决同班同名数据插入的问题

  • 主键与auto_increment(自增) 连用

mysql> create table t8(
             id int primary key auto_increment,
             name char(5)
             );
登录后复制

注:要设置自增的前提是,字段必须为主键才可以设置自增;设置自增的字段必须是数值类型的,字符类型是不能自增的。

示例:创建一个自增主键的表

mysql> create table db2.t6(
    -> stu_num int primary key auto_increment,
    -> name char(10),
    -> age int
    -> );
mysql> desc db2.t6;
登录后复制

mysql> insert into db2.t6(name,age) values("bob",19);
mysql> select * from db2.t6;
登录后复制

mysql> insert into db2.t6(name,age) values("tom",20);
mysql> insert into db2.t6(name,age) values("lucy",19);
mysql> select * from db2.t6;
登录后复制

mysql> insert into db2.t6 values(3,"lucy",19);     //错误原因,因为字段stu_num是主键,所以值是不能重复的
ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'
mysql> insert into db2.t6 values(9,"lucy",19);     //可以是除了1~3以外的别的数字,可以按顺序,也可以不按顺序
mysql> select * from db2.t6;
登录后复制

mysql> insert into db2.t6(name,age) values("jack",25);     //如果在插入一条数据,这条数据不给stu_num赋值,那么字段stu_num的默认值,是从最大数开始自增赋值,即字段stu_num默认值为10,而不是4
mysql> select * from db2.t6;
登录后复制

示例:如果清空表记录,在插入数据,那么字段stu_num的值是从1开始自增,还是从10开始自增呢?

mysql> delete from db2.t6;     //清空表记录
mysql> select * from db2.t6;      //输出结果显示为空表
Empty set (0.00 sec)
mysql> insert into db2.t6(name,age) values("bob",18);      //插入一个数据
mysql> select * from db2.t6;     //虽然删除了表中的全部数据,但是会记录上一次自增到哪个数字了,然后插入的数据会从上一次所记录的数字开始自增
登录后复制

mysql> insert into db2.t6(name,age) values(null,"tom",18); //主键不能为空,但此处我们给主键字段stu_num赋值为NULL,却不报错,原因是空就相当于与没有给字段stu_num赋值,没赋值所以就会以自增的方式进行赋值,所以此处赋值NULL不会报错

mysql> select * from db2.t6;

示例:通常把表中唯一标识记录的字段设置为主键,如记录编号字段

mysql> alter table db2.stuinfo add id int primary key auto_increment first;
mysql> desc db2.stuinfo;
登录后复制

mysql> select * from db2.stuinfo;

foreign key外键

  • 外键功能

—— 插入记录时,字段值在另一个表字段值范围内选择

  • 使用规则

—— 表存储引擎必须是innodb

—— create table 库名.表名(... ...) engine=innodb; //指定表存储的引擎

—— 插入记录的表的字段与被参照的表的字段类型要一致

—— 被参照字段的值要唯一且不能为空,所以必须要是索引类型的主键(primary key)

  • 创建外键

—— create table 表名(
        字段名列表,
        foreign key(字段名) references 库名.表名(字段名)       //指定外键
        on update cascde                                               //同步更新
        on delete cascade                                               //同步删除
         ) engine=innodb;                                               //指定存储引擎                                                      -5
登录后复制

创建一个员工表作为参考表:

mysql> create table db2.yuangong(
    -> id int primary key auto_increment,
    -> name char(20),
    -> sex enum("boy","girl")
    -> )engine=innodb;
mysql> desc db2.yuangong;
登录后复制

mysql> insert into db2.yuangong(name,sex) values("bob","boy");
mysql> insert into db2.yuangong(name,sex) values("lucy","girl");
mysql> select * from db2.yuangong;
登录后复制

创建一个工资表设置外键,以员工表作为参考表:

mysql> create table db2.gongzi(
    -> id int,
    -> salary float(7,2),
    -> foreign key(id) references db2.yuangong(id)
    -> on update cascade
    -> on delete cascade
    -> ) engine=innodb;
mysql> desc db2.gongzi;
登录后复制

//如图所示,外键创建成功后会自动创建索引,对数据进行排序,所以标志就是普通索引的标志,我们可以通过另一种方法进行查看
查看是不是外键的方法:
mysql> show create table db2.gongzi;      //查看创建表的命令
登录后复制

mysql> insert into db2.gongzi values(1,10000);
mysql> insert into db2.gongzi values(2,20000);
mysql> select * from db2.gongzi;
登录后复制

mysql> insert into db2.gongzi values(3,20000); //给id为3员工发工资报错,原因:给gongzi表里字段id赋值3,但由于gongzi表设置了外键,将gongzi表的id字段参考了yuangong表的id字段,所以给gongzi表id字段赋值时,这个值必须要在yuangong表的id字段里面有,才能进行赋值。

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db2`.`gongzi`, CONSTRAINT `gongzi_ibfk_1` FOREIGN KEY (`id`) REFERENCES `yuangong` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)

  • 同步更新

将yuangong表中id字段值为2的改为8:

mysql> select * from db2.yuangong;

mysql> update db2.yuangong set id=8 where id=2; //将yuangong表中id字段的2改为8,同步更新表gongzi表id字段为2的记录

mysql> select * from db2.yuangong;

mysql> select * from db2.gongzi; //发现yuangong表的id字段值从2改为8后,gongzi表的id字段的值也从2变为8

  • 同步删除

将yuangong表中id字段值为8的删除掉:

mysql> delete from db2.yuangong where id=8;       //将yuangong表中id字段为8删除掉,同步删除表gongzi表id字段为8的记录
mysql> select * from db2.yuangong;
登录后复制

mysql> select * from db2.gongzi; //发现yuangong表的id字段值为8被删除后,gongzi表的id字段值为8的也被删除

  • 注意事项

mysql> insert into db2.yuangong(name,sex) values("jack","boy");
mysql> select * from db2.yuangong;
登录后复制

mysql> insert into db2.gongzi values(3,30000);
mysql> select * from db2.gongzi;
登录后复制

mysql> insert into db2.gongzi values(3,30000);)
mysql> insert into db2.gongzi values(3,30000);
mysql> insert into db2.gongzi values(null,65000);
mysql> select * from db2.gongzi;
登录后复制

注:如上所示,字段id为3的被重复赋值,且字段id也被赋空值。因为参考表yuangong表里的字段id里面的值有1和3,所以gongzi表中的字段id就可以重复赋值1或3。这样赋值在生产环境中很不合理,所以我们通过将gongzi表中的id字段设置为主键,这样就能解决重复赋值和赋值空值的问题。

1)删除gongzi表的数据

mysql> delete from db2.gongzi;     //删除gongzi表中的所有记录
mysql> select * from db2.gongzi;       //查询表记录为空,说明表记录已被删除
Empty set (0.00 sec)
登录后复制

2)将字段id设置为主键

mysql> desc db2.gongzi;

mysql> alter table db2.gongzi add primary key(id);      //将gongzi表中的id字段设置为主键
mysql> desc db2.gongzi;
登录后复制

3)进行赋值测试

mysql> insert into db2.gongzi values(1,10000);
mysql> insert into db2.gongzi values(3,30000);
mysql> insert into db2.gongzi values(1,10000);      //再次重复赋值,出现错误,原因是主键不允许有重复的值
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> insert into db2.gongzi values(3,30000);      //再次重复赋值,出现错误,原因是主键不允许有重复的值
ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'
mysql> insert into db2.gongzi values(null,30000);        //赋空值,出现错误,原因是主键不允许赋空值
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into db2.gongzi values(2,30000);      //参考表yuangong表中的id字段没有值为2的记录,不在参考表范围内的值不能进行赋值
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db2`.`gongzi`, CONSTRAINT `gongzi_ibfk_1` FOREIGN KEY (`id`) REFERENCES `yuangong` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
登录后复制
  • 删除外键

—— alter table 库名.表名 drop foreign key 外键名;

mysql> show create table db2.gongzi;

//注:红线圈起来的地方就是外键的名称

mysql> alter table db2.gongzi drop foreign key gongzi_ibfk_1; //删除外键

mysql> show create table db2.gongzi; //查看创建表的命令,发现没有创建外键的记录了

此时我们就可以插入除了yuangong表id字段的值范围以外的值了

mysql> insert into db2.gongzi values(2,30000);
mysql> insert into db2.gongzi values(9,30000);
mysql> select * from db2.gongzi;
登录后复制

由于gongzi表的id字段还是主键,所以不能赋重复的值和空值

mysql> insert into db2.gongzi values(9,30000);
ERROR 1062 (23000): Duplicate entry '9' for key 'PRIMARY'
mysql> insert into db2.gongzi values(null,30000);
ERROR 1048 (23000): Column 'id' cannot be null
登录后复制

推荐学习:mysql视频教程

以上是详细介绍MySQL键值(整理总结)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

MySQL:初学者的数据管理易用性 MySQL:初学者的数据管理易用性 Apr 09, 2025 am 12:07 AM

MySQL适合初学者使用,因为它安装简单、功能强大且易于管理数据。1.安装和配置简单,适用于多种操作系统。2.支持基本操作如创建数据库和表、插入、查询、更新和删除数据。3.提供高级功能如JOIN操作和子查询。4.可以通过索引、查询优化和分表分区来提升性能。5.支持备份、恢复和安全措施,确保数据的安全和一致性。

忘记数据库密码,能在Navicat中找回吗? 忘记数据库密码,能在Navicat中找回吗? Apr 08, 2025 pm 09:51 PM

Navicat本身不存储数据库密码,只能找回加密后的密码。解决办法:1. 检查密码管理器;2. 检查Navicat的“记住密码”功能;3. 重置数据库密码;4. 联系数据库管理员。

navicat premium怎么创建 navicat premium怎么创建 Apr 09, 2025 am 07:09 AM

使用 Navicat Premium 创建数据库:连接到数据库服务器并输入连接参数。右键单击服务器并选择“创建数据库”。输入新数据库的名称和指定字符集和排序规则。连接到新数据库并在“对象浏览器”中创建表。右键单击表并选择“插入数据”来插入数据。

mysql怎么复制表 mysql怎么复制表 Apr 08, 2025 pm 07:24 PM

在 MySQL 中复制表需要创建新表、插入数据、设置外键、复制索引、触发器、存储过程和函数。具体步骤包括:创建具有相同结构的新表。将数据从原始表插入新表。设置相同的外键约束(如果原始表有)。创建相同索引。创建相同触发器(如果原始表有)。创建相同存储过程或函数(如果原始表使用了)。

mysql怎么查看 mysql怎么查看 Apr 08, 2025 pm 07:21 PM

通过以下命令查看 MySQL 数据库:连接到服务器:mysql -u 用户名 -p 密码运行 SHOW DATABASES; 命令获取所有现有数据库选择数据库:USE 数据库名;查看表:SHOW TABLES;查看表结构:DESCRIBE 表名;查看数据:SELECT * FROM 表名;

Navicat for MariaDB如何查看数据库密码? Navicat for MariaDB如何查看数据库密码? Apr 08, 2025 pm 09:18 PM

Navicat for MariaDB 无法直接查看数据库密码,因为密码以加密形式存储。为确保数据库安全,有三个方法可重置密码:通过 Navicat 重置密码,设置复杂密码。查看配置文件(不推荐,风险高)。使用系统命令行工具(不推荐,需要对命令行工具精通)。

mysql怎么复制粘贴 mysql怎么复制粘贴 Apr 08, 2025 pm 07:18 PM

MySQL 中的复制粘贴包含以下步骤:选择数据,使用 Ctrl C(Windows)或 Cmd C(Mac)复制;在目标位置右键单击,选择“粘贴”或使用 Ctrl V(Windows)或 Cmd V(Mac);复制的数据将插入到目标位置,或替换现有数据(取决于目标位置是否已存在数据)。

navicat如何执行sql navicat如何执行sql Apr 08, 2025 pm 11:42 PM

在 Navicat 中执行 SQL 的步骤:连接到数据库。创建 SQL 编辑器窗口。编写 SQL 查询或脚本。单击“运行”按钮执行查询或脚本。查看结果(如果执行查询的话)。

See all articles