Skip to content

关系型数据库

核心概念

  • 主键(Primary Key): 唯一标识一条记录的字段或字段组合。
  • 索引(Index): 用于加速数据检索的数据结构,类似于书的目录。
  • 视图(View): 基于一个或多个表的虚拟表,用于简化查询和保护数据。
  • 事务(Transaction): 一组 SQL 语句,作为一个整体被数据库处理,要么全部成功,要么全部失败,保证数据的一致性。
  • 锁(Lock): 用于并发控制,防止多个用户同时修改同一数据。
  • 范式(Normalization): 数据库设计理论,用于减少数据冗余、提高数据一致性。

(一)主键

代表身份证,唯一,非空,不变

实践

  • 主键约束
sql
CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT
);

(二)外键

外键约束

场景

CASCADE:当父表中的数据更新或删除时,子表中与之关联的数据也会被自动更新或删除。

SET NULL:当父表中的数据被删除或更新时,子表中相关字段被置为NULL

NO ACTION:不允许父表数据删除或更新与子表数据关联的记录,通常与RESTRICT一起使用,表示对不符合外键约束的操作进行限制。

RESTRICT:与NO ACTION类似,阻止对父表的删除或更新操作,直到没有引用此数据的子表记录。

例子

代码解释:

1. 创建 customers 表(客户表)

sql
CREATE TABLE customers (
    id INT PRIMARY KEY,
    name VARCHAR(100) 
);
  • CREATE TABLE customers:这是创建一个名为 customers 的新表。
  • id INT PRIMARY KEY:表中的 id 列是整型(INT),并且设置为主键(PRIMARY KEY)。主键是唯一标识每一行数据的字段,也就是每个客户都有一个唯一的 id
  • name VARCHAR(100)name 列是变长字符串类型(VARCHAR),最大长度为100个字符,用于存储客户的名字。

所以,这段代码的作用是创建一个客户表,表中有两个列:id(唯一标识客户)和 name(客户的名字)。

2. 创建 orders 表(订单表)

sql
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    order_date DATE,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(id)
);
  • CREATE TABLE orders:这是创建一个名为 orders 的新表。
  • order_id INT PRIMARY KEY:表中的 order_id 列是整型(INT),并且是主键(PRIMARY KEY)。每个订单都有一个唯一的 order_id
  • order_date DATEorder_date 列是日期类型(DATE),用于存储订单的日期。
  • customer_id INTcustomer_id 列是整型(INT),它将存储客户的 ID,用来标识哪个客户创建了这个订单。这里的 customer_id 是外键(FOREIGN KEY),它与 customers 表中的 id 列关联。

3. 外键约束(建立表之间的关联)

sql
FOREIGN KEY (customer_id) REFERENCES customers(id)
  • FOREIGN KEY (customer_id):定义 orders 表中的 customer_id 列为外键。
  • REFERENCES customers(id):外键 customer_id 引用的是 customers 表中的 id 列。意思是 orders 表中的 customer_id 值必须是 customers 表中已存在的 id 值,确保每个订单都有一个有效的客户。

(三)唯一约束

tex
主键不允许为 NULL,而唯一约束列允许 NULL

(四)复合主键

定义

tex
是指由多个列(字段)组合成一个主键,用来唯一标识一条记录。在数据库中,每个表通常会有一个主键,用来确保每条记录的唯一性。而复合主键就是通过组合多个列的值来保证唯一性。

理解

tex
假设有一个学生成绩表,每个学生在每个科目上都有一条成绩记录。如果我们仅用学生的学号作为主键,会出现学生在多个科目上的成绩无法区分的问题。于是,我们可以用学生的学号和科目名称作为复合主键来唯一标识每一条成绩记录。

实践

sql
CREATE TABLE student_scores (
    student_id INT NOT NULL,
    subject VARCHAR(100) NOT NULL,
    score DECIMAL(5,2),
    PRIMARY KEY (student_id, subject)  -- 复合主键:student_id + subject
);

(五)自动增长字段

用于生成唯一且递增的值

sql
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);

(六)索引

总结

普通索引 用于加速查询。

唯一索引 除了加速查询外,还保证数据列的唯一性。

复合索引 可以用于多列查询,提高多条件查询效率。

全文索引 适用于需要全文搜索的场景(如新闻、博客等文本内容)。

创建普通索引

sql
CREATE INDEX index_name ON table_name (column_name);
  • index_name:索引的名称。
  • table_name:要创建索引的表名。
  • column_name:要在其上创建索引的列名。

创建唯一索引

唯一索引保证索引列中的数据是唯一的,不能有重复值。

sql
CREATE UNIQUE INDEX index_name ON table_name (column_name);

创建复合索引(多列索引)

sql
CREATE INDEX index_name ON table_name (column1, column2);

创建全文索引

用于全文搜索,适用于文本类型的列(如 TEXTVARCHAR)。

sql
CREATE FULLTEXT INDEX index_name ON table_name (column_name);

创建空间索引

用于地理空间数据的索引。

sql
CREATE SPATIAL INDEX index_name ON table_name (column_name);

(七)唯一标识符UUID

全局唯一:UUID 的设计目标是使得在分布式系统中生成的标识符具有全局唯一性,几乎不可能重复。

不依赖于中心化的服务器:UUID 可以在没有中心化协调的情况下生成,因此适用于分布式系统。

常用版本

  • UUID v1:基于时间戳和节点(如 MAC 地址)生成,确保唯一性。
  • UUID v4:基于随机数生成(大部分位是随机的),通常用于大多数场景,因为它不依赖于系统时间或硬件。