MySQL(50)如何使用UNSIGNED属性?

在 MySQL 中,UNSIGNED 属性用于数值数据类型(如 TINYINTSMALLINTMEDIUMINTINTBIGINT),表示该列只能存储非负整数。使用 UNSIGNED 属性可以有效地扩展列的正整数范围,因为它不需要为负数保留空间。

1. 定义与用途

  • 定义UNSIGNED 属性用于指定数值列只能存储非负整数。
  • 用途:用于只需要存储正数的场景,如计数器、ID、库存数量等。

2. 范围

不同数据类型的 UNSIGNED 和未使用 UNSIGNED 时的取值范围如下:

  • TINYINT
    • 有符号(默认):-128 到 127
    • 无符号:0 到 255
  • SMALLINT
    • 有符号(默认):-32,768 到 32,767
    • 无符号:0 到 65,535
  • MEDIUMINT
    • 有符号(默认):-8,388,608 到 8,388,607
    • 无符号:0 到 16,777,215
  • INT
    • 有符号(默认):-2,147,483,648 到 2,147,483,647
    • 无符号:0 到 4,294,967,295
  • BIGINT
    • 有符号(默认):-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
    • 无符号:0 到 18,446,744,073,709,551,615

3. 示例代码

以下是一些示例代码,展示了如何使用 UNSIGNED 属性创建表,并插入和检索数据。

创建表

创建一个包含 UNSIGNED 属性的表:

sql 复制代码
CREATE DATABASE test_unsigned_db;
USE test_unsigned_db;

CREATE TABLE inventory (
    item_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    item_name VARCHAR(50) NOT NULL,
    quantity INT UNSIGNED DEFAULT 0  -- 无符号整数,默认值为0
);

插入数据

插入一些数据:

sql 复制代码
-- 插入数据
INSERT INTO inventory (item_name, quantity) VALUES 
('Laptop', 50),
('Smartphone', 100),
('Tablet', 30);

检索数据

检索数据:

sql 复制代码
SELECT item_id, item_name, quantity FROM inventory;

检索结果:

plaintext 复制代码
+---------+-------------+----------+
| item_id | item_name   | quantity |
+---------+-------------+----------+
|       1 | Laptop      |       50 |
|       2 | Smartphone  |      100 |
|       3 | Tablet      |       30 |
+---------+-------------+----------+

插入负数数据(将失败)

尝试插入负数数据:

sql 复制代码
-- 尝试插入负数数据,将失败
INSERT INTO inventory (item_name, quantity) VALUES 
('Camera', -10);

执行结果:

plaintext 复制代码
ERROR 1264 (22003): Out of range value for column 'quantity' at row 1

4. 更复杂的示例:用户积分系统

以下是一个更复杂的示例,展示了如何在用户积分系统中使用 UNSIGNED 属性。

创建用户积分表

sql 复制代码
CREATE TABLE user_points (
    user_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    points BIGINT UNSIGNED DEFAULT 0  -- 无符号大整数,默认值为0
);

插入用户数据

插入一些用户数据:

sql 复制代码
-- 插入用户数据
INSERT INTO user_points (username, points) VALUES 
('john_doe', 1000),
('jane_smith', 1500),
('alice_jones', 2000);

检索用户数据

检索用户数据:

sql 复制代码
SELECT user_id, username, points FROM user_points;

检索结果:

plaintext 复制代码
+---------+-------------+--------+
| user_id | username    | points |
+---------+-------------+--------+
|       1 | john_doe    |   1000 |
|       2 | jane_smith  |   1500 |
|       3 | alice_jones |   2000 |
+---------+-------------+--------+

尝试插入负数积分(将失败)

尝试插入负数积分:

sql 复制代码
-- 尝试插入负数积分,将失败
INSERT INTO user_points (username, points) VALUES 
('tom_hanks', -500);

执行结果:

plaintext 复制代码
ERROR 1264 (22003): Out of range value for column 'points' at row 1

5. 注意事项

  • 范围限制 :由于 UNSIGNED 属性只允许非负数,试图插入负数会导致错误。
  • 自动递增 :对于自动递增(AUTO_INCREMENT)的列,使用 UNSIGNED 属性可以有效地扩展 ID 的正整数范围。
  • 兼容性 :确保业务逻辑不需要存储负数,否则使用 UNSIGNED 会导致数据插入失败。

小结

  • UNSIGNED 属性:用于指定数值列只能存储非负整数,适用于计数器、ID、库存数量等场景。
  • 扩展正整数范围 :使用 UNSIGNED 可以有效地扩展列的正整数范围。
  • 实际应用 :通过指定 UNSIGNED 属性,可以确保数据的正整数范围符合业务需求,提高数据完整性和一致性。

通过理解 UNSIGNED 属性的用途和特点,可以更好地设计和优化数据库表,确保数据插入操作符合业务需求。上述示例展示了如何在实际应用中使用 UNSIGNED 属性设计数据库表,并插入和检索数据。

相关推荐
qq_297574678 小时前
【实战教程】SpringBoot 集成阿里云短信服务实现验证码发送
spring boot·后端·阿里云
韩立学长9 小时前
【开题答辩实录分享】以《智能大学宿舍管理系统的设计与实现》为例进行选题答辩实录分享
数据库·spring boot·后端
编码者卢布12 小时前
【Azure Storage Account】Azure Table Storage 跨区批量迁移方案
后端·python·flask
她说..14 小时前
策略模式+工厂模式实现审批流(面试问答版)
java·后端·spring·面试·springboot·策略模式·javaee
梦梦代码精15 小时前
开源、免费、可商用:BuildingAI一站式体验报告
开发语言·前端·数据结构·人工智能·后端·开源·知识图谱
李慕婉学姐16 小时前
【开题答辩过程】以《基于Spring Boot的疗养院理疗管理系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·spring boot·后端
tb_first16 小时前
SSM速通2
java·javascript·后端
一路向北⁢16 小时前
Spring Boot 3 整合 SSE (Server-Sent Events) 企业级最佳实践(一)
java·spring boot·后端·sse·通信
风象南16 小时前
JFR:Spring Boot 应用的性能诊断利器
java·spring boot·后端
爱吃山竹的大肚肚17 小时前
微服务间通过Feign传输文件,处理MultipartFile类型
java·spring boot·后端·spring cloud·微服务