一文通览MySQL数据库之魂:主键、外键、约束与索引浅析

news/2024/10/20 16:40:08/

一文通览MySQL数据库之魂:主键、外键、约束与索引浅析

摘要: 本文将深入剖析MySQL数据库的核心元素,包括主键、外键、约束与各种索引。我们将逐一为您详解这些关键概念,并通过实例说明它们的使用方法。

目录

  • 一、主键
    • 1. 基本定义
    • 2. 优缺点
    • 3. 使用示例
  • 二、外键
    • 1. 基本定义
    • 2. 优缺点
    • 3. 使用示例
  • 三、约束
    • 1. 常见类型
    • 2. 使用示例
  • 四、索引
    • 1. 基本定义
    • 2. 索引类型
    • 3. 优缺点
    • 4. 使用示例

一、主键

1. 基本定义

主键(Primary Key)是一个唯一标识数据表中每一行记录的约束。一个数据表中只能有一个主键,主键列不允许孤立的NULL值,同时必须具备唯一性。

2. 优缺点

优点

  • 快速定位唯一行
  • 确保数据完整性
  • 即使数据表结构较复杂,也能便捷地建立表与表之间的关联

缺点

  • 增加存储空间开销
  • 可能对性能产生影响

3. 使用示例

CREATE TABLE `users` (`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`username` VARCHAR(255) NOT NULL,`email` VARCHAR(255) NOT NULL,PRIMARY KEY (`id`)
);

二、外键

1. 基本定义

外键(Foreign Key)是具有引用完整性的字段,它引用其他表的主键。用于保持数据表间的关系和完整性,防止破坏数据库中的数据关系。

2. 优缺点

优点

  • 保持实体之间引用的完整性和一致性
  • 减少无效和冗余数据

缺点

  • 增加复杂性
  • 对性能可能产生影响

3. 使用示例

CREATE TABLE `orders` (`order_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`user_id` INT UNSIGNED NOT NULL,`product_id` INT UNSIGNED NOT NULL,`quantity` INT UNSIGNED NOT NULL,PRIMARY KEY (`order_id`),CONSTRAINT `fk_orders_users`FOREIGN KEY (`user_id`)REFERENCES `users` (`id`),CONSTRAINT `fk_orders_products`FOREIGN KEY (`product_id`)REFERENCES `products` (`id`)
);

三、约束

1. 常见类型

  • 主键约束:见前文
  • 外键约束:见前文
  • 唯一约束(UNIQUE):确保某一列中不存在重复值
  • 非空约束(NOT NULL):确保某一列中不出现NULL
  • CHECK约束:检查某列中的值是否符合指定的条件

2. 使用示例

CREATE TABLE `employees` (`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`name` VARCHAR(255) NOT NULL,`email` VARCHAR(255) NOT NULL UNIQUE,`age` INT UNSIGNED NOT NULL,`salary` DECIMAL(10, 2) NOT NULL,PRIMARY KEY (`id`),CONSTRAINT `check_age` CHECK (age >= 18)
);

四、索引

1. 基本定义

索引(Index)是数据库中用于快速查找满足SQL语句条件的记录方法。利用索引可以大幅提高查询性能。

2. 索引类型

  • 单列索引:针对单列创建的索引
  • 复合索引:针对多列(组合)创建的索引
  • 主键索引:主键字段上自动创建的索引
    -唯一索引:确保索引列的唯一性
  • 全文索引:针对长文本进行全文检索的索引
  • 空间索引:针对地理空间数据类型创建的索引

3. 优缺点

优点

  • 提高查询速度
  • 加速表连接

缺点

  • 占用额外存储空间
  • 增加数据维护开销(插入、更新、删除操作)

4. 使用示例

以下示例演示了如何为 employees 表的 name 列创建一个单列索引:

CREATE INDEX `idx_employees_name` ON `employees` (`name`);

以下示例演示了如何为 employees 表的 nameage 列创建一个复合索引:

CREATE INDEX `idx_employees_name_age` ON `employees` (`name`, `age`);

以下示例演示了如何为 articles 表的 content 列创建一个全文索引:

CREATE FULLTEXT INDEX `idx_articles_content` ON `articles` (`content`);

总之,本文详细介绍了MySQL数据库中主键、外键、约束与各种索引的基本概念及其优缺点。通过使用主键、外键和约束,可以确保数据库中的数据完整性和一致性,而使用合适类型的索引可以提高查询性能。灵活掌握这些概念,有助于设计高效、可扩展的数据库结构。


http://www.ppmy.cn/news/461321.html

相关文章

#10030. 「一本通 1.4 练习 2」Keyboarding

[ICPC2015 WF]Keyboarding 题面翻译 给定一个 r r r 行 c c c 列的在电视上的「虚拟键盘」,通过「上,下,左,右,选择」共 5 5 5 个控制键,你可以移动电视屏幕上的光标来打印文本。一开始,光…

Linux 下的Bluetooth 架构

文章转载自:http://blog.sina.com.cn/samzhen1977 实战Linux Bluetooth编程(一) 协议栈概述 Sam一年前在Linux下写了一个类似Windows下BTW的库--BTX。现在需要添加新功能时发现很多知识点都忘记了。所以决定在这次学习中,把一些bl…

人员定位系统硬件篇:蓝牙定位信标知识科普

蓝牙定位信标是一种使用电池供电,基于低功耗蓝牙广播协议的无线电子设备,是区域人员定位系统中不可或缺的一个节点。它通常固定在某个位置,向周围进行周期性广播,进而与终端设备进行信息交互,蓝牙定位信标具备发送“信…

Bluetooth--蓝牙开发扫描设备,及蓝牙设备类型

请先阅读: http://blog.csdn.net/angcyo/article/details/52035894 1:AndroidManifest.xml注册蓝牙扫描广播 注意蓝牙的权限. <!--蓝牙广播--> <receiverandroid:name"com.angcyo.bluetooth.BluetoothReceiver"android:exported"true"><…

Android蓝牙内核级设备驱动设计

蓝牙内核级设备驱动设计 1、Android 蓝牙架构 1)蓝牙设备驱动的位置 – 内核之中 2)协议位于内核中的有哪些 —— HCI接口实现、L2CAP、RFCOMM 3) C++ 中的是怎样通信的 —— 使用到一个接口 socket API 也就是内核的蓝牙模块给上层呈现的是网络接口的模式 ,所以上层访问…

硬件篇:教你做STM32蓝牙小车(基于STM32F103ZET6)

重要声明 看过我前面51小车博客的都知道我是软件工程专业的&#xff0c;对于硬件方面都是因为感兴趣自学的&#xff0c;这不&#xff0c;因为今年寒假放假比较早&#xff0c;趁这个时间学习了STM32相关知识&#xff0c;经过近一个月的学习对于STM32算是入门了&#xff0c;为了…

Android 蓝牙 bluetoothle 开发

前段时间项目中用到了bluetoothle 方面的开发&#xff0c;项目结束后总结一下&#xff0c;开发的流程与一些思路&#xff1b; 主要步骤 一&#xff1a;注册蓝牙所需权限 二&#xff1a;Android 6.0 以上权限获取定位权限 三&#xff1a;开启蓝牙 四&#xff1a;注册一个专门…

蓝牙开发|蓝牙技术介绍

蓝牙技术介绍 1. 蓝牙概述 蓝牙&#xff0c;是一种支持设备短距离通信&#xff08;一般10m内&#xff09;的无线电技术&#xff0c;能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术&#xff0c;能够有效地简化移动通…