首页
学习
活动
专区
圈层
工具
发布

mysql建表设置取值范围

基础概念

MySQL是一种关系型数据库管理系统,用于存储和管理数据。在建表时,可以通过设置字段的数据类型和约束来限制取值范围。

相关优势

  1. 数据完整性:通过设置取值范围,可以确保数据的准确性和一致性。
  2. 防止错误输入:限制取值范围可以避免用户输入无效或不合理的数据。
  3. 提高查询效率:合理的字段类型和约束可以优化数据库性能。

类型

  1. 数据类型:如INTFLOATVARCHAR等,每种类型都有其特定的取值范围。
  2. 约束
    • NOT NULL:确保字段不为空。
    • UNIQUE:确保字段的值唯一。
    • CHECK:限制字段的取值范围。
    • PRIMARY KEY:主键约束,确保字段的唯一性和非空性。

应用场景

假设我们要创建一个用户表,其中有一个年龄字段,我们需要确保年龄在0到120之间。

代码语言:txt
复制
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT CHECK (age >= 0 AND age <= 120)
);

遇到的问题及解决方法

问题:为什么设置了CHECK约束后,仍然可以插入超出范围的数据?

原因

  • CHECK约束在某些情况下可能不会生效,例如在某些旧版本的MySQL中,或者在某些特定的存储引擎中。
  • 数据库的配置可能会影响CHECK约束的执行。

解决方法

  1. 检查MySQL版本:确保使用的是支持CHECK约束的MySQL版本(MySQL 8.0及以上版本)。
  2. 使用触发器:通过触发器来实现取值范围的检查。
代码语言:txt
复制
DELIMITER $$
CREATE TRIGGER check_age_before_insert
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
    IF NEW.age < 0 OR NEW.age > 120 THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = '年龄必须在0到120之间';
    END IF;
END$$
DELIMITER ;
  1. 应用层验证:在应用程序层面进行数据验证,确保插入的数据符合要求。

参考链接

通过以上方法,可以有效地设置和检查MySQL表中字段的取值范围,确保数据的完整性和准确性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 粗聊Mysql——你会建库建表么?

    本文中说到的“建”,并非单纯的建一个库,或是建一张表,而是你建好的库和表在项目的运营中,是否能应付各种事件,下面我说说几个我在项目中遇到的问题以及处理的方法,算是一个小小的心得,给大家分享下。...比如现在有2张表,一张新闻栏目表,一张新闻表,现在两张表需要进行关联,我想大多数人的做法肯定是在新闻表里建一个新闻栏目id,然后把新闻栏目表里的主键ID(自增)写到这个字段里,通过这样进行两表关联。   ...所以我建议两表之间关联不用主键,而是单独建一个编号的字段,我们这里可以用mysql的uuid()函数做为编号,相关文献可以参考《UUID做主键好还是不好》,只所以一张表要2个主键,一个物理主键(自增id...至于性能,我本地测了下基本上没差异,网上也有人做了10W条数据的测试——《实测MYSQL UUID性能》。...三、不要把varchar长度设太“死”   这也是我之前经常犯得一个毛病,比如手机,我就设置为varchar(11),邮编设置成varchar(6),姓名设置成varchar(10)等等等等,看似每个字段都设置得很严谨

    7.8K10

    mysql常见的建表选项和约束

    约束主要是防止非法数据进入表中,保证数据的正确性和一致性,统称为数据完整性 约束也可以防止一个表被删除 MySQL的约束保存在information_schema.table_constraints中...,外键是构建于一个表的两个字段或者是两个表的两个字段之间的参照关系 注意: 具有外键约束的列的值不能随便给,必须满足外键所引用的主键的取值 一张表中可以定义多个外键 外键列默认可以给null值 父子表...,那么联通子行一起删除,相当于rm -f on delete set null:当删除父表中的行时,如果子表中有依赖于被删除的父行的子行存在,那么不删除,而是将子行的外键设置为null 外键引用定义...Oracle中国可以使用check约束,有相应作用 mysql> create table test_ck( -> id int check(id>0) -> ); mysql...> insert into test_ck values(-100); mysql> select * from test_ck; +------+ | id | +------+ |

    2.6K10

    MySQL建表时需要注意什么

    MySQL建表时需要注意什么命名规范✅(大厂红线,基础但必问)统一团队规范,避免后续维护灾难,核心原则:全小写+下划线分隔,禁止驼峰和中文表名前缀统一(如t_),避免与MySQL关键字冲突见名知意,禁止无意义缩写...索引设计(面试核心考点)索引是MySQL性能的灵魂,建表时就要规划好,核心原则:少而精,按需创建必须有主键:推荐自增bigint或雪花算法ID,绝对禁止无主键表联合索引遵循最左前缀原则,过滤性高的字段放前面避免冗余索引...:历史数据归档到历史表,主表只存热数据垂直拆分:将不常用的大字段或低频字段拆到扩展表避免宽表:单表字段数控制在30个以内,过多会影响查询效率约束与安全(数据一致性保障)非空约束:所有业务字段都应设置非空和默认值唯一约束...建表注意事项面试官:“你在项目里负责过不少数据库设计,那直接聊聊,MySQL建表的时候你最关注哪些点?...应聘者:“TIMESTAMP有时区转换问题,而且范围只到2038年,DATETIME范围大又省心。引擎闭眼选InnoDB,事务、行锁、崩溃恢复都靠它。

    12410

    MySQL建表数据类型的选择

    如果查询中包含可为 NULL 的列,对 MySQL 来说更难优化,因为可为 NULL 的列使得索引、索引统计和值比较都更复杂。特别是计划在列上建索引,就应该尽量避免设计成可为 NULL 的列。...主键自增 id 适合设置为 unsigned 属性的 int 类型。...MySQL 可以为整数类型指定宽度,例如 int(11),对大多数应用这是没有意义的:它不会限制值的合法范围,只是规定了 MySQL 的一些交互工具(例如 MySQL 命令行客户端)用来显示字符的个数。...枚举(enum)类型 MySQL 在内部会将每个值在列表中的位置保存为整数,并且在表的 .frm 文件中保存 “数字-字符串” 映射关系的 “查找表”。...日期和时间类型: MySQL 能存储的最小时间粒度为秒。 datetime 保存范围从 1001 年到 9999 年,精度为秒。与时区无关。使用 8 字节的存储空间。

    7.5K10

    MySQL建库、表、增删改查语句Demo

    本页目录 库语句 建库 修改库字符集 指定库排序规则 当前库状态的建表语句 删除库 Navicat编辑数据库时执行的SQL 表语句 建表 添加字段 修改表 修改字段 修改表字符集、排序规则 截断表 删除表...添加索引 一直都是用MySQL可视化工具,几乎没碰过建库、表等语句了。...库语句 建库 -- 数据库配置文件default-character-set是utf8_mb3,则会导致创建的表是utf8mb3。...我们无法人为控制,只能建库完毕后执行修改库字符集或者建库前修改MySQL配置 CREATE DATABASE IF NOT EXISTS `school` DEFAULT CHARACTER SET...直接执行就行,没有参数 SELECT @@character_set_database, @@collation_database 表语句 建表 添加字段 修改表 修改字段 修改表字符集、排序规则 截断表

    6.9K40

    MySQL数据库建表、优化、算法、分区分库分表总结

    建表 一、主键设置 主键为什么不推荐有业务含义? 1、因为任何有业务含义的列都有改变的可能性,主键一旦带上了业务含义,那么主键就有可能发生变更。...,对于没有主键的表,在查询和索引定义上有一定的影响; 避免表字段运行为null,建议设置默认值(例如:int类型设置默认值为0)在索引查询上,效率立显; 建立索引,最好建立在唯一和非空的字段上...什么情况下应不建或少建索引?...1、表记录太少 2、经常插入、删除、修改的表 3、数据重复且分布平均的表字段,假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度...六、MySQL支持的分区类型有哪些? RANGE分区:这种模式允许将数据划分不同范围。

    6.9K31

    MySQL数据表操作全指南:建表、修改、删除一步到位【MySQL系列】

    本文全面梳理 MySQL 数据库表的创建(CREATE)、修改(ALTER)、删除(DROP)三大操作,涵盖 DDL 语句基础、常用字段类型选型、主外键与约束设计、规范化建模思路,并结合典型业务场景展示...DDL 语句详解 2.1 CREATE TABLE 最常见的建表语句,用于定义新表及其列、索引、约束等。...3.1 数值类型 类型 范围(有符号) 存储空间 适用场景 TINYINT -128 ~ 127 1 字节 状态、标志位 SMALLINT -32768 ~ 32767 2 字节 人数、评分等 INT...TEXT / MEDIUMTEXT / LONGTEXT:海量文本,不建议建索引。 3.3 时间与日期类型 DATE:仅含年月日。 DATETIME:精确到秒,不受时区影响。...常见操作与注意事项 DDL 原子性:MySQL 8.0+ 已支持部分 DDL 原子,低版本需谨慎并在运维窗口执行; ALTER ONLINE:使用在线 DDL(如 ALGORITHM=INPLACE)减少业务中断

    3.2K10
    领券