ENUM 和 SET 是 MySQL 中两种专门用于定义枚举和集合类型的数据类型。它们的主要用途是限制字段的合法值,从而提高数据的完整性和一致性。以下是对 ENUM 和 SET 数据类型的详细解释,并结合代码示例说明其使用方法。
1. ENUM 数据类型
ENUM 是一种字符串对象,用于表示一个从预定义的字符串集合中选出的单一值。
优点
可以确保字段的值只能是预定义的集合中的某一个。
存储效率高,查询速度快。
用途
ENUM 通常用于表示具有有限选择的字段,例如状态(状态:‘active’, ‘inactive’, ‘pending’)或类别(类别:‘small’, ‘medium’, ‘large’)。
示例代码
创建一个表示用户状态的表:
CREATE DATABASE test_enum_set_db;
USE test_enum_set_db;
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
status ENUM('active', 'inactive', 'pending') NOT NULL
);插入数据:
INSERT INTO users (username, status) VALUES
('alice', 'active'),
('bob', 'inactive'),
('charlie', 'pending');检索数据:
SELECT * FROM users;
检索结果:
+---------+----------+----------+ | user_id | username | status | +---------+----------+----------+ | 1 | alice | active | | 2 | bob | inactive | | 3 | charlie | pending | +---------+----------+----------+
2. SET 数据类型
SET 是一种字符串对象,可以有零个或多个值,每个值必须是指定的一组值中的一个。
优点
支持多个值的组合存储。
可用于表示一个字段具有多个属性的情况。
用途
SET 通常用于表示具有多个可能值的字段,例如用户权限(权限:‘read’, ‘write’, ‘execute’)或兴趣(兴趣:‘sports’, ‘music’, ‘travel’)。
示例代码
创建一个表示用户兴趣的表:
CREATE TABLE user_interests (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
interests SET('sports', 'music', 'travel', 'reading', 'coding')
);插入数据:
INSERT INTO user_interests (username, interests) VALUES
('alice', 'sports,music'),
('bob', 'reading,coding'),
('charlie', 'travel,music,sports');检索数据:
SELECT * FROM user_interests;
检索结果:
+---------+----------+-------------------+ | user_id | username | interests | +---------+----------+-------------------+ | 1 | alice | sports,music | | 2 | bob | reading,coding | | 3 | charlie | travel,music,sports| +---------+----------+-------------------+
3. 综合示例:商品管理系统
以下是一个更复杂的示例,展示了如何在商品管理系统中使用 ENUM 和 SET。
创建商品表
CREATE TABLE products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
category ENUM('electronics', 'clothing', 'books', 'furniture') NOT NULL,
tags SET('new', 'sale', 'featured', 'limited') NOT NULL
);插入商品数据
-- 插入商品数据
INSERT INTO products (product_name, category, tags) VALUES
('Laptop', 'electronics', 'new,featured'),
('T-shirt', 'clothing', 'sale,limited'),
('Bookshelf', 'furniture', 'new'),
('Smartphone', 'electronics', 'new,sale');检索商品数据
-- 检索商品数据 SELECT * FROM products;
检索结果
+------------+--------------+-------------+-----------------+ | product_id | product_name | category | tags | +------------+--------------+-------------+-----------------+ | 1 | Laptop | electronics | new,featured | | 2 | T-shirt | clothing | sale,limited | | 3 | Bookshelf | furniture | new | | 4 | Smartphone | electronics | new,sale | +------------+--------------+-------------+-----------------+
4. 注意事项
ENUM:
最多可以有 65,535 个不同的值。
尽量不要频繁修改 ENUM 列的定义,因为这可能需要重新定义整个表。
字符串值是区分大小写的。
SET:
最多可以有 64 个不同的值。
每个字段可以存储多个值的组合,使用逗号分隔。
如果插入的值不在预定义集合中,它们会被忽略。
小结
ENUM:用于存储单选值,确保字段值只能是预定义集合中的某一个,适用于状态、类别等。
SET:用于存储多选值,允许字段有多个预定义值的组合,适用于权限、标签、兴趣等。
通过理解 ENUM 和 SET 数据类型的用途和特点,可以更好地设计和优化数据库表,确保数据的完整性和一致性。上述示例展示了如何在实际应用中使用 ENUM 和 SET 设计数据库表,并插入和检索数据。
原文链接:https://blog.csdn.net/qq_43012298/article/details/139227849