3. mysql 学习笔记 - 主键 id和表字段类型

75 阅读5分钟

在 MySQL 中,ID主键(Primary Key) 是关系型数据库中非常重要的概念。它们决定了如何唯一标识每一行数据,同时影响数据库的查询效率、数据完整性和表的结构设计.

  • 主键 是数据库表中用来唯一标识每一行数据的字段,通常设置为自增 ID。

  • 字段类型 决定了数据存储的格式和范围,选择合适的数据

1. ID 主键(Primary Key)

主键概念

  • 主键 是用于唯一标识数据库表中每一行数据的列(或多列)。每个表只能有一个主键。

  • 主键的值是 唯一的,不能重复。

  • 主键的值不能为 NULL,必须始终有效。

  • 主键一般是作为表中的标识符,便于快速查询和关联操作。

主键特点

  • 唯一性:表中每一行都有唯一的主键值。

  • 非空性:主键不能为 NULL

  • 索引:创建主键时,数据库会自动为该字段创建索引,以加速查询操作。

自增 ID(AUTO_INCREMENT)

在 MySQL 中,主键字段通常设置为 自增,这样每次插入新记录时,数据库会自动生成一个唯一的 ID 值,无需手动设置。

  • 使用 AUTO_INCREMENT 可以让 ID 在插入时自动增长。

  • 自增列通常是整数类型。

示例:创建一个带有主键的表

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);
  • 在这个例子中,id 字段是主键(PRIMARY KEY),并且设置为 自动增长AUTO_INCREMENT)。

  • 每次插入新记录时,id 值会自动生成,且每次递增1。

插入数据时自动生成 ID
INSERT INTO users (name, email) VALUES ('alice', 'alice@163.com');
INSERT INTO users (name, email) VALUES ('kim', 'kim@163.com');

上面的插入语句不需要指定 id 值,MySQL 会自动为每一条记录生成唯一的 id(例如,1, 2)。

查看自动增长的 ID 值

每次插入数据后,可以使用以下命令查看自动生成的 id 值:

SELECT 918006;

这个命令会返回最近一次插入操作所生成的 AUTO_INCREMENT 值。

2. 字段类型

字段类型(数据类型)定义了数据库中存储数据的种类和格式。在 MySQL 中,有多种不同的字段类型,每种类型都有其适用的场景。字段类型可以大致分为以下几类:

1. 整数类型(Numeric Types)

整数类型用于存储整数数据。根据存储空间的不同,MySQL 提供了多种整数类型:

1. TINYINT:非常小的整数,-128 到 127(有符号)或 0 到 255(无符号)。

id TINYINT

2. SMALLINT:较小的整数,-32,768 到 32,767(有符号)或 0 到 65,535(无符号)。

age SMALLINT

3. MEDIUMINT:中等大小的整数,-8,388,608 到 8,388,607(有符号)或 0 到 16,777,215(无符号)。

code MEDIUMINT

4. INTINTEGER:常用的整数类型,-2,147,483,648 到 2,147,483,647(有符号)或 0 到 4,294,967,295(无符号)。

salary INT

5. BIGINT:非常大的整数,适合需要存储极大数值的场景,-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807(有符号)或 0 到 18,446,744,073,709,551,615(无符号)。

population BIGINT

2. 浮点类型(Floating-Point Types)

浮点数用于存储带有小数部分的数字。

1. FLOAT:单精度浮点数,适用于需要较低精度的场景。精度通常为 7 位有效数字。

price FLOAT

2. DOUBLEREAL:双精度浮点数,精度为 15 位有效数字,适合存储更精确的浮点数值。

temperature DOUBLE

3. DECIMALNUMERIC:定点数,通常用于存储需要高精度的财务数据或货币。指定精度和小数位数。

balance DECIMAL(10, 2)

总共有10位数字,其中2位小数

3. 日期和时间类型(Date and Time Types)

MySQL 提供多种数据类型来存储日期和时间:

1. DATE:只存储日期(年-月-日),格式为 YYYY-MM-DD

birth_date DATE

2. DATETIME:存储日期和时间,格式为 YYYY-MM-DD HH:MM:SS

created_at DATETIME

3. TIMESTAMP:存储自1970年1月1日起的秒数,用于记录时间戳。MySQL 会自动为字段赋值当前时间。

last_updated TIMESTAMP

4. TIME:存储时间(时:分:秒),不包含日期。

duration TIME

5. YEAR:存储年份,格式为 YYYY

start_year YEAR

4. 字符串类型(String Types)

1. CHAR:定长字符串,最多 255 字符。如果字符串长度不足,MySQL 会用空格填充。

code CHAR(10)

2. VARCHAR:变长字符串,最大长度为 65,535 字符,存储实际输入的字符串长度。

name VARCHAR(100)

3. TEXT:用于存储较长的文本数据,最大长度为 65,535 字符。

description TEXT

4. BLOB:二进制大对象,用于存储二进制数据(如图像、音频等),最大长度为 65,535 字节。

image BLOB

5. ENUM:用于存储预定义的字符串集合中的一个值。每个字段值必须是 ENUM 定义列表中的一个。

gender ENUM('male', 'female', 'other')

6. SET:用于存储预定义的多个字符串值的组合(可选多个值)。

colors SET('red', 'green', 'blue')

3. ID 主键的常见实践

自增 ID(AUTO_INCREMENT) :通常主键设置为 AUTO_INCREMENT,这样可以确保每条记录有一个唯一的 ID,而无需显式地为其设置值。

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    price DECIMAL(10, 2)
);

UUID(通用唯一标识符) :有时可以使用 UUID 作为主键,尤其是当需要分布式系统中的唯一标识符时。UUID 可以通过 UUID() 函数生成:

CREATE TABLE orders (
    id CHAR(36) PRIMARY KEY,
    user_id INT,
    order_date DATETIME
);

插入数据时:

INSERT INTO orders (id, user_id, order_date) VALUES (UUID(), 1, NOW());

复合主键:有时你可能会选择将多个字段联合起来作为主键。这种情况通常用于表中没有单一字段可以唯一标识记录时。

CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id)
);