一文彻底搞清楚MySQL的主键、外键、约束和各种索引

 更新时间:2023年06月12日 11:05:59   作者:陈橘又青  
主键用于唯一标识表中每一行数据,外键用于建立表与表之间关联关系,约束用于限制表中数据的规则,索引用于加速查询,本文就将带大家底搞清楚MySQL的主键、外键、约束和各种索引,感兴趣的小伙伴可以跟着小编一起来学习

1. 主键

主键是一种用于唯一标识表中每一行数据的标识符。在Mysql中,主键可以是一个或多个列的组合,但是必须满足以下条件:

  • 主键列的值必须唯一,不能重复。
  • 主键列的值不能为空,不能为NULL。
  • 一个表只能有一个主键。

主键可以用于加速查询和提高数据的完整性和安全性。在Mysql中,主键可以通过以下两种方式定义:

1.1. 在创建表时定义主键

在创建表时,可以通过在列定义后面添加PRIMARY KEY关键字来定义主键。例如:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

上面的例子中,id列被定义为主键。

1.2. 在已有表中添加主键

在已有表中添加主键,可以使用ALTER TABLE语句。例如:

ALTER TABLE `users` ADD PRIMARY KEY (`id`);

2. 外键

外键是一种用于建立表与表之间关联关系的机制。外键可以用于保证数据的完整性和一致性。在Mysql中,外键可以通过以下两种方式定义:

2.1. 在创建表时定义外键

在创建表时,可以通过在列定义后面添加FOREIGN KEY关键字来定义外键。例如:

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `quantity` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`user_id`) REFERENCES `users`(`id`),
  FOREIGN KEY (`product_id`) REFERENCES `products`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

上面的例子中,orders表中的user_id和product_id列被定义为外键,分别引用了users表和products表中的id列。

2.2. 在已有表中添加外键

在已有表中添加外键,可以使用ALTER TABLE语句。例如:

3. 约束

约束是一种用于限制表中数据的规则。在Mysql中,约束可以用于保证数据的完整性和一致性。Mysql支持以下几种约束:

3.1. NOT NULL约束

NOT NULL约束用于限制列中的数据不能为NULL。例如:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

上面的例子中,name和email列被定义为NOT NULL。

3.2. UNIQUE约束

UNIQUE约束用于限制列中的数据不能重复。例如:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL UNIQUE,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

上面的例子中,email列被定义为UNIQUE。

3.3. CHECK约束

CHECK约束用于限制列中的数据必须满足指定的条件。例如:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `age` int(11) NOT NULL,
  CHECK (`age` >= 18),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

上面的例子中,age列被定义为CHECK约束,要求age的值必须大于等于18。

3.4. DEFAULT约束

DEFAULT约束用于指定列的默认值。例如:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  `status` tinyint(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

上面的例子中,status列被定义为DEFAULT约束,如果插入数据时没有指定status的值,则默认为0。

4. 索引

索引是一种用于加速查询的机制。在Mysql中,索引可以用于提高查询效率和保证数据的完整性和一致性。Mysql支持以下几种索引:

4.1. PRIMARY KEY索引

PRIMARY KEY索引是一种用于唯一标识表中每一行数据的索引。在Mysql中,每个表只能有一个PRIMARY KEY索引。例如:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

上面的例子中,id列被定义为PRIMARY KEY索引。

4.2. UNIQUE索引

UNIQUE索引是一种用于限制列中的数据不能重复的索引。在Mysql中,每个表可以有多个UNIQUE索引。例如:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL UNIQUE,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

上面的例子中,email列被定义为UNIQUE索引。

4.3. INDEX索引

INDEX索引是一种用于加速查询的索引。在Mysql中,每个表可以有多个INDEX索引。例如:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  INDEX `idx_name` (`name`),
  INDEX `idx_email` (`email`),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

上面的例子中,name和email列被定义为INDEX索引。

4.4. FULLTEXT索引

FULLTEXT索引是一种用于全文搜索的索引。在Mysql中,每个表只能有一个FULLTEXT索引。例如:

CREATE TABLE `articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(50) NOT NULL,
  `content` text NOT NULL,
  FULLTEXT INDEX `idx_content` (`content`),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

上面的例子中,content列被定义为FULLTEXT索引。

5. 总结

本文介绍了Mysql中主键、外键、约束和索引的概念和用法。在实际应用中,应根据具体情况选择合适的主键、外键、约束和索引,以提高数据的完整性和一致性,加速查询。

以上就是一文彻底搞清楚MySQL的主键、外键、约束和各种索引的详细内容,更多关于MySQL主键、外键、约束和索引的资料请关注脚本之家其它相关文章!

相关文章

  • Mysql优化技巧之Limit查询的优化分析

    Mysql优化技巧之Limit查询的优化分析

    这篇文章主要给大家介绍了关于Mysql优化技巧之Limit查询的优化分析,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • MySQL批量插入数据脚本

    MySQL批量插入数据脚本

    shell下向mysql批量插入数据的范例代码,有需要的小伙伴可以参考下
    2016-02-02
  • Mysql using使用详解

    Mysql using使用详解

    本文主要介绍了Mysql using使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • MySQL中列子查询与行子查询操作的学习教程

    MySQL中列子查询与行子查询操作的学习教程

    这篇文章主要介绍了MySQL中列子查询与行子查询操作的学习教程,子查询是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-12-12
  • MySQL如何处理InnoDB并发事务中的间隙锁死锁

    MySQL如何处理InnoDB并发事务中的间隙锁死锁

    这篇文章主要为大家介绍了MySQL如何处理InnoDB并发事务中的间隙锁死锁,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • MySQL联合查询之轻松实现数据关联详解

    MySQL联合查询之轻松实现数据关联详解

    MySQL中当查询数据来自多张表时需要用到关联查询,下面这篇文章主要给大家介绍了关于MySQL联合查询之轻松实现数据关联的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • MySQL动态字符串处理DYNAMIC_STRING

    MySQL动态字符串处理DYNAMIC_STRING

    本文主要给大家简单讲解了mysql如何使用DYNAMIC_STRING来进行动态字符串的保存,非常的实用,有需要的小伙伴可以参考下
    2016-10-10
  • MySQL如何利用DCL管理用户和控制权限

    MySQL如何利用DCL管理用户和控制权限

    这篇文章主要介绍了MySQL如何利用DCL管理用户和控制权限,帮助大家更好的理解和学习MySQL的使用,感兴趣的朋友可以了解下
    2020-11-11
  • Mysql 索引结构直观图解介绍

    Mysql 索引结构直观图解介绍

    Mysql-索引结构直观图解。上一篇刚刚通俗化的说明了B-TREE的几个结果与存储方式,其实跟索引感觉上还是没有关联起来, 那么本篇,就通过实际的一个数据行的例子,说明一下
    2016-12-12
  • Linux下安装与使用MySQL详细介绍

    Linux下安装与使用MySQL详细介绍

    以下是对在Linux下安装与使用MySQL进行了详细的介绍,需要的朋友可以过来参考下
    2013-08-08

最新评论