mysql中主键是索引吗

mysql主键不是索引。主键全称“主键约束”,是对表中数据的一种约束,它是表的一个特殊字段,该字段能唯一标识该表中的每条信息;而索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。

mysql中主键是索引吗

本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。

MySQL 主键

在 MySQL 中,主键(PRIMARY KEY)的完整称呼是“主键约束”,是 MySQL 中使用最为频繁的约束。一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中设置一个主键。

约束是指对表中数据的一种约束,能够帮助数据库管理员更好地管理数据库,并且能够确保数据库中数据的正确性和有效性。

主键是表的一个特殊字段,该字段能唯一标识该表中的每条信息。例如,学生信息表中的学号是唯一的。

主键分为单字段主键和多字段联合主键,本节将分别讲解这两种主键约束的创建、修改和删除。

使用主键应注意以下几点:

每个表只能定义一个主键。

主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据。这是唯一性原则。

一个字段名只能在联合主键字段表中出现一次。

联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则。

在创建表时设置主键约束

在创建数据表时设置主键约束,既可以为表中的一个字段设置主键,也可以为表中多个字段设置联合主键。但是不论使用哪种方法,在一个表中主键只能有一个。下面分别讲解设置单字段主键和多字段联合主键的方法。

1)设置单字段主键

在 CREATE TABLE 语句中,通过 PRIMARY KEY 关键字来指定主键。

在定义字段的同时指定主键,语法格式如下:

  PRIMARY KEY [默认值]

例 1

在 test_db 数据库中创建 tb_emp3 数据表,其主键为 id,SQL 语句和运行结果如下。

mysql> CREATE TABLE tb_emp3    -> (    -> id INT(11) PRIMARY KEY,    -> name VARCHAR(25),    -> deptId INT(11),    -> salary FLOAT    -> );Query OK, 0 rows affected (0.37 sec)mysql> DESC tb_emp3;+--------+-------------+------+-----+---------+-------+| Field  | Type        | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| id     | int(11)     | NO   | PRI | NULL    |       || name   | varchar(25) | YES  |     | NULL    |       || deptId | int(11)     | YES  |     | NULL    |       || salary | float       | YES  |     | NULL    |       |+--------+-------------+------+-----+---------+-------+4 rows in set (0.14 sec)

或者是在定义完所有字段之后指定主键,语法格式如下:

[CONSTRAINT ] PRIMARY KEY [字段名]

例 2

在 test_db 数据库中创建 tb_emp4  数据表,其主键为 id,SQL 语句和运行结果如下。

mysql> CREATE TABLE tb_emp4    -> (    -> id INT(11),    -> name VARCHAR(25),    -> deptId INT(11),    -> salary FLOAT,    -> PRIMARY KEY(id)    -> );Query OK, 0 rows affected (0.37 sec)mysql> DESC tb_emp4;+--------+-------------+------+-----+---------+-------+| Field  | Type        | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| id     | int(11)     | NO   | PRI | NULL    |       || name   | varchar(25) | YES  |     | NULL    |       || deptId | int(11)     | YES  |     | NULL    |       || salary | float       | YES  |     | NULL    |       |+--------+-------------+------+-----+---------+-------+4 rows in set (0.14 sec)

2)在创建表时设置联合主键

所谓的联合主键,就是这个主键是由一张表中多个字段组成的。

比如,设置学生选课数据表时,使用学生编号做主键还是用课程编号做主键呢?如果用学生编号做主键,那么一个学生就只能选择一门课程。如果用课程编号做主键,那么一门课程只能有一个学生来选。显然,这两种情况都是不符合实际情况的。

实际上设计学生选课表,要限定的是一个学生只能选择同一课程一次。因此,学生编号和课程编号可以放在一起共同作为主键,这也就是联合主键了。

主键由多个字段联合组成,语法格式如下:

PRIMARY KEY [字段1,字段2,…,字段n]

注意:当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。

例 3

创建数据表 tb_emp5,假设表中没有主键 id,为了唯一确定一个员工,可以把 name、deptId 联合起来作为主键,SQL 语句和运行结果如下。

mysql> CREATE TABLE tb_emp5    -> (    -> name VARCHAR(25),    -> deptId INT(11),    -> salary FLOAT,    -> PRIMARY KEY(name,deptId)    -> );Query OK, 0 rows affected (0.37 sec)mysql> DESC tb_emp5;+--------+-------------+------+-----+---------+-------+| Field  | Type        | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| name   | varchar(25) | NO   | PRI | NULL    |       || deptId | int(11)     | NO   | PRI | NULL    |       || salary | float       | YES  |     | NULL    |       |+--------+-------------+------+-----+---------+-------+3 rows in set (0.14 sec)

在修改表时添加主键约束

主键约束不仅可以在创建表的同时创建,也可以在修改表时添加。但是需要注意的是,设置成主键约束的字段中不允许有空值。

在修改数据表时添加主键约束的语法格式如下:

ALTER TABLE  ADD PRIMARY KEY();

查看 tb_emp2 数据表的表结构,SQL 语句和运行结果如下所示。

mysql> DESC tb_emp2;+--------+-------------+------+-----+---------+-------+| Field  | Type        | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| id     | int(11)     | NO   |     | NULL    |       || name   | varchar(30) | YES  |     | NULL    |       || deptId | int(11)     | YES  |     | NULL    |       || salary | float       | YES  |     | NULL    |       |+--------+-------------+------+-----+---------+-------+4 rows in set (0.14 sec)

例 4

修改数据表 tb_emp2,将字段 id 设置为主键,SQL 语句和运行结果如下。

mysql> ALTER TABLE tb_emp2    -> ADD PRIMARY KEY(id);Query OK, 0 rows affected (0.94 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> DESC tb_emp2;+--------+-------------+------+-----+---------+-------+| Field  | Type        | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| id     | int(11)     | NO   | PRI | NULL    |       || name   | varchar(30) | YES  |     | NULL    |       || deptId | int(11)     | YES  |     | NULL    |       || salary | float       | YES  |     | NULL    |       |+--------+-------------+------+-----+---------+-------+4 rows in set (0.12 sec)

通常情况下,当在修改表时要设置表中某个字段的主键约束时,要确保设置成主键约束的字段中值不能够有重复的,并且要保证是非空的。否则,无法设置主键约束。

MySQL  索引(Index)

索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。

通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列。否则,数据库系统将读取每条记录的所有信息进行匹配。

可以把索引比作新华字典的音序表。例如,要查“库”字,如果不使用音序,就需要从字典的 400 页中逐页来找。但是,如果提取拼音出来,构成音序表,就只需要从 10 多页的音序表中直接查找。这样就可以大大节省时间。

索引的优缺点

索引有其明显的优势,也有其不可避免的缺点。

优点

索引的优点如下:

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

可以给所有的 MySQL 列类型设置索引。

可以大大加快数据的查询速度,这是使用索引最主要的原因。

在实现数据的参考完整性方面可以加速表与表之间的连接。

在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间

缺点

增加索引也有许多不利的方面,主要如下:

创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。

索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。

当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。

使用索引时,需要综合考虑索引的优点和缺点。

索引可以提高查询速度,但是会影响插入记录的速度。因为,向有索引的表中插入记录时,数据库系统会按照索引进行排序,这样就降低了插入记录的速度,插入大量记录时的速度影响会更加明显。这种情况下,最好的办法是先删除表中的索引,然后插入数据,插入完成后,再创建索引。

【相关推荐:mysql视频教程】

以上就是mysql中主键是索引吗的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/182589.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小米11青春版怎样设置时间_小米11青春版设置时间方法
上一篇 2026年9月3日 16:11:24
我国科学家观测到最强逻辑形式量子关联
下一篇 2026年9月3日 16:15:42

相关推荐

  • 如何使用mysql开发项目管理任务表

    首先设计包含任务基本信息的主表tasks,包含id、title、status、priority等字段,并通过project_id和assignee_id关联项目与用户;为支持多对多关系创建user_tasks中间表;常用操作包括按项目或负责人查询任务、筛选高优先级任务、更新状态及查找即将到期任务;结…

    2026年9月12日
    100
  • Swoole如何实现分布式?分布式方案有哪些?

    基于Swoole构建分布式系统的核心思路是解耦、高性能承载与可观测可伸缩,通过服务拆分、RPC或消息队列通信、服务注册发现、分布式缓存及数据库策略等实现高并发、低延迟的分布式架构,同时借助容器化、链路追踪和日志系统应对复杂性与运维挑战。 Swoole本身并非一个开箱即用的分布式框架,它更像是一个高性…

    2026年9月12日
    100
  • 如何在mysql中监控主从同步健康状况

    答案:监控MySQL主从同步需检查复制线程状态、延迟及错误。1. 执行SHOW SLAVE STATUS,确认Slave_IO_Running和Slave_SQL_Running为Yes,无Last_Error;2. 关注Seconds_Behind_Master判断延迟;3. 使用pt-heart…

    2026年9月12日
    400
  • 如何在mysql中使用字符串连接符实现字段拼接

    使用CONCAT()和CONCAT_WS()函数实现MySQL字符串拼接,前者用于常规拼接,后者可跳过NULL值并添加分隔符,避免结果为NULL,推荐优先使用以确保兼容性和正确性。 在 MySQL 中,字符串拼接不能使用像其他编程语言中的 + 或 || 符号,而是通过内置函数或操作符来实现。最常用的…

    2026年9月12日
    100
  • 如何设置mysql日志文件路径便于管理

    合理设置MySQL日志路径可提升维护效率并避免磁盘空间问题;2. 通过SHOW VARIABLES命令查看当前日志配置;3. 在my.cnf或my.ini的[mysqld]段落中设置log_error、general_log_file和slow_query_log_file路径;4. 建议将日志统一…

    2026年9月11日
    200
  • 如何在mac系统上正确安装mysql

    推荐使用Homebrew或官方DMG包在Mac上安装MySQL。首先可通过/bin/bash -c命令安装Homebrew,再执行brew install mysql并启动服务;或从官网下载DMG包图形化安装,通过系统设置管理服务。无论哪种方式,都需运行mysql_secure_installati…

    2026年9月11日
    100
  • MySQL如何实现多租户数据隔离_架构设计有哪些方案?

    MySQL如何实现多租户数据隔离_架构设计有哪些方案?MySQL如何实现多租户数据隔离_架构设计有哪些方案?MySQL如何实现多租户数据隔离_架构设计有哪些方案?MySQL如何实现多租户数据隔离_架构设计有哪些方案?

    多租户数据隔离的核心方案有三种:独立数据库、独立schema和共享schema加租户id字段。1. 独立数据库提供最强隔离性,适合合规性要求高的场景,但资源消耗大、管理复杂;2. 独立schema在共享实例下为每个租户分配独立表,资源利用率较高但开发复杂度增加;3. 共享schema加租户id字段通…

    2026年9月11日 用户投稿
    200
  • Swoole如何做容器化部署?Docker如何集成?

    Swoole容器化部署通过Docker实现环境一致、资源隔离、快速伸缩,结合多阶段构建优化镜像,利用Docker Compose或Kubernetes管理服务依赖与编排,提升运维效率与系统稳定性。 Swoole的容器化部署,本质上就是将Swoole应用及其依赖打包进Docker镜像,通过Docker…

    2026年9月11日
    100
  • mysql如何设计索引提升查询效率

    合理设计索引需遵循:1. 优先为查询频繁字段建索引,选择高区分度字段,避免低效字段单独建索引;2. 使用复合索引并遵守最左前缀原则,将筛选性强的字段前置;3. 避免函数操作、隐式转换、OR条件及左通配LIKE导致索引失效;4. 利用覆盖索引减少回表,提升查询性能。 在MySQL中,合理设计索引是提升…

    2026年9月11日
    100
  • mysql数据库中如何处理多语言字段

    采用分离式多语言表结构,通过product_i18n表存储不同语言内容,结合utf8mb4字符集和标准语言标签,支持灵活扩展与查询,并利用JOIN和COALESCE实现语言回退,确保数据完整性与可维护性。 在MySQL数据库中处理多语言字段,核心思路是灵活设计数据结构,以支持不同语言内容的存储与查询…

    2026年9月11日
    200
  • 如何配置mysql数据目录权限

    MySQL数据目录权限需正确配置以确保安全与正常运行。首先通过SELECT @@datadir;确认路径,常见为/var/lib/mysql;使用ls -ld检查属主,若非mysql用户则执行sudo chown -R mysql:mysql /var/lib/mysql修正;推荐权限设为750或7…

    2026年9月11日
    100
  • 如何在mysql中恢复数据避免重复导入

    答案:避免MySQL重复导入需根据场景选择策略。全量恢复时用TRUNCATE清空表后导入;增量恢复用INSERT ON DUPLICATE KEY UPDATE或REPLACE处理冲突;生产环境可借助临时表比对差量数据再导入;并通过幂等性设计如版本标记表防止重复执行,确保数据一致性。 在 MySQL…

    2026年9月11日
    100
  • 如何在docker中配置mysql网络访问权限

    要实现外部访问Docker中MySQL需四步:1. 启动容器时用-p映射3306端口;2. 创建或修改用户权限允许’%’远程登录;3. 确保bind-address设为0.0.0.0;4. 开放宿主机防火墙及云安全组规则。 在 Docker 中运行 MySQL 时,默认情况下…

    2026年9月11日
    000
  • 如何在mysql中迁移数据库到新服务器

    先使用mysqldump备份原数据库并传输文件至新服务器,再在新服务器上通过mysql命令导入数据。具体步骤:1. 用mysqldump导出单库或全库(含存储过程、触发器及事务一致性);2. 使用scp等工具将.sql文件传到新服务器;3. 新服务器安装MySQL并启动服务,创建对应数据库后,执行m…

    2026年9月11日
    000
  • mysql数据库中如何设计统计表

    答案:设计MySQL统计表需根据业务需求明确统计维度、更新策略和性能要求,通过合理表结构与索引提升查询效率。应确定指标如订单量、销售额,按日期、类目等粒度聚合,选择合适字段类型,设置主键与索引,避免冗余;采用定时、增量或混合更新机制保证数据一致,并考虑分表、归档与扩展性,确保统计系统高效可维护。 在…

    2026年9月11日
    500
  • Swoole如何处理高并发?并发瓶颈如何解决?

    Swoole处理高并发的核心在于异步非阻塞I/O与协程。它通过事件循环监听多个连接,仅在数据可读时触发回调,避免阻塞进程,从而高效处理大量并发连接。协程使异步代码同步化,减少回调嵌套,提升可读性与并发性能。Swoole通过多worker进程利用多核CPU,主进程分发连接至worker进程,避免单点瓶…

    2026年9月11日
    100
  • 如何在mysql中优化分区查询

    答案:MySQL分区可提升查询性能,但需合理设计分区策略并确保查询条件能触发分区裁剪。应优先选用RANGE或LIST分区,避免在分区键上使用函数,确保WHERE条件包含分区键以实现高效过滤。每个分区内部需配置局部索引,高频查询字段应与分区键组合优化。通过EXPLAIN PARTITIONS验证查询是…

    2026年9月11日
    100
  • mysql数据库中如何使用计算列

    计算列是MySQL中通过表达式自动计算值得特殊列,分为虚拟(VIRTUAL)和存储(STORED)两种类型。1. 虚拟列不占空间,读取时动态计算;2. 存储列在写入时计算并持久化,读取更快但占用存储。例如创建订单表时,total列可定义为price与quantity的乘积:CREATE TABLE …

    2026年9月11日
    100
  • mysql如何进行分页查询

    MySQL分页通过LIMIT和OFFSET实现,语法为SELECT FROM table_name LIMIT limit_count OFFSET offset_count;2. 实际应用中每页显示固定条数,如查询users表第1页LIMIT 10 OFFSET 0,第2页LIMIT 10 OFF…

    2026年9月11日
    100
  • Swoole如何实现动态配置?配置如何实时更新?

    Swoole实现动态配置需依赖配置源与分发机制,通过定时轮询或事件驱动推送更新Worker进程配置,结合版本控制、原子性操作及平滑重启策略,确保配置实时生效与服务稳定性。 Swoole要实现动态配置和配置的实时更新,核心在于利用其进程常驻的特性,结合外部配置中心或简单的存储机制,并通过Swoole提…

    2026年9月11日
    000

发表回复

登录后才能评论
关注微信