在 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. INT 或 INTEGER:常用的整数类型,-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. DOUBLE 或 REAL:双精度浮点数,精度为 15 位有效数字,适合存储更精确的浮点数值。
temperature DOUBLE
3. DECIMAL 或 NUMERIC:定点数,通常用于存储需要高精度的财务数据或货币。指定精度和小数位数。
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)
);