还记得mysql这些原理的知识吗?

本文深入解析数据库系统的构成,包括DBS、DBMS和DBA的角色,详述数据模型的三大组成部分:数据结构、数据操作与完整性约束。同时,介绍了层次模型、网状模型和关系模型的特点,以及MySQL的三大范式,探讨了关系数据库的设计原则,解释了模式、外模式和内模式的概念,列举了数据库常用对象,并对比了InnoDB和MyISAM两种存储引擎。

1、数据库系统(DBS)的组成

由数据库(DB)、数据库管理系统(DBMS)、数据库管理员(DBA)组成。

2、数据模型的三组成部分

  • 数据结构:是对系统静态特征的描述,描述对象包括数据的类型、内容、性质和数据之间的项目关系。
  • 数据操作:是对系统动态特征的描述,是对数据库各种对象实例的操作。
  • 完整性约束:是完整性规则的集合,它定义了给定数据模型中数据及其联系所具有的制约和依存规则。

3、常用的数据模型主要有:层次模型、网状模型和关系模型

  • 层次模型:用树状结构表示实体类型及实体间联系的数据模型称为层次模型。
    (1)每棵树有且仅有一个无双亲节点,称为根。
    (2)树中除根外所有节点有且仅有一个双亲。
  • 网状模型:用有向图结构表示实体类型及实体间联系的数据模型称为网状模型。
  • 关系模型:以二维表来描述数据。关系模型中每个表有多个字段列和记录行,每个字段列有固定属性。
    关系模型基本术语:
    (1)关系:一个二维表就是一个关系。
    (2)元组:二维表中的一行,即表中的记录。
    (3)属性:二维表中的一列,用类型和值来表示。
    (4)域:每个属性取值的变化范围,如性别的域为(男,女)。
    (5)关系中的数据约束:
    实体完整性约束:约束关系的主键中属性值不能为空值。
    参照完整性约束:关系之间的基本约束。
    用户自定义的完整性约束:反映了具体应用中数据的语义要求。

4、mysql三大范式

  • 第一范式:确保每列的原子性
    (1)如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式。
    (2)例如:顾客表(姓名、编号、地址、……)其中"地址"列还可以细分为国家、省、市、区等。
  • 第二范式:在第一范式的基础上更进一层,目标是确保表中的每列都和主键相关
    (1)如果一个关系满足第一范式,并且除了主键以外的其它列,都依赖于该主键,则满足第二范式。
    (2)例如:订单表(订单编号、产品编号、定购日期、价格、……),"订单编号"为主键,"产品编号"和主键列没有直接的关系,即"产品编号"列不依赖于主键列,应删除该列。
  • 第三范式:在第二范式的基础上更进一层,目标是确保每列都和主键列直接相关,而不是间接相关
    (1)如果一个关系满足第二范式,并且除了主键以外的其它列都不依赖于主键列,则满足第三范式。
    (2)为了理解第三范式,需要根据Armstrong公里之一定义传递依赖。假设A、B和C是关系R的三个属性,如果A-〉B且B-〉C,则从这些函数依赖中,可以得出A-〉C,如上所述,依赖A-〉C是传递依赖。
    (3)例如:订单表(订单编号,定购日期,顾客编号,顾客姓名,……),初看该表没有问题,满足第二范式,每列都和主键列"订单编号"相关,再细看你会发现"顾客姓名"和"顾客编号"相关,"顾客编号"和"订单编号"又相关,最后经过传递依赖,"顾客姓名"也和"订单编号"相关。为了满足第三范式,应去掉"顾客姓名"列,放入客户表中。

5、关系数据库的设计原则

  • (1)数据库内数据文件的数据组织应获得最大限度的共享,最小的冗余度,消除数据及数据依赖关系中的冗余部分,使依赖于同一个数据模型的数据达到有效的分离。
  • (2)保证输入、修改数据时数据的一致性与正确性。
  • (3)保证数据与使用数据的应用程序之间的高度独立性。

6、数据库的三级模式结构:模式、外模式、内模式

  • 模式:
    模式也称为逻辑模式或概念模式,是数据库中全体数据中的逻辑结构和特征的描述,是所有用户的公共数据视图。一个数据库只有一个模式。模式处于三级结构的中间层。
  • 外模式
    外模式也称为用户模式,是数据库用户(包括应用程序猿和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图是与某一应用有关的的数据的逻辑表示。。外模式是模式的子集,一个数据库可以有多个外模式。
  • 内模式
    内模式也称为存储模式,是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。一个数据库只有一个内模式

7、数据库常用对象

  • 表:包含数据库中所有数据的数据库对象,由行和列组成。
  • 字段:表中每列称为一个字段。
  • 索引:是一个单独的、物理的数据库结构。它是依赖于表建立的,在数据库中索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需的数据。
  • 视图:从一张或多张表中导出的表。
  • 存储过程:增删改差的sql语句集合。

8、两种常见的存储引擎

InnoDB

  • InnoDB 在 MySQL 5.5 及以后成为默认索引,它的特点是:
  1. 支持行锁,采用 MVCC 来支持高并发
  2. 支持事务
  3. 支持外键
  4. 支持崩溃后的安全恢复
  5. 不支持全文索引
  6. InnoDB 是一个事务型存储引擎,为用户操作非常大的数据存储提供了一个强大的解决方案,已经被很多互联网公司使用。
  • 在以下场合下,使用InnoDB是最理想的选择:
  1. 更新密集的表:InnoDB存储引擎特别适合处理多重并发的更新请求。
  2. 事务:InnoDB 存储引擎是支持事务的标准MySQL存储引擎。
  3. 自动灾难恢复:与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。
  4. 外键约束:MySQL支持外键的存储引擎只有InnoDB。
  5. 支持自动增加列 AUTO_INCREMENT 属性。

MyISAM

  • MyISAM 引擎是 MySQL 5.1 及之前版本的默认引擎,它的特点是:
  1. 不支持行锁,读取时对需要读到的所有表加锁,写入时则对表加排它锁
  2. 不支持事务
  3. 不支持外键
  4. 不支持崩溃后的安全恢复
  5. 在表有读取查询的同时,支持往表中插入新纪录
  6. 支持 BLOB 和 TEXT 的前500个字符索引,支持全文索引
  7. 支持延迟更新索引,极大提升写入性能
  8. 对于不会进行修改的表,支持压缩表,极大减少磁盘空间占用

参考资料:
《mysql从入门到精通》—明日科技

<think>好的,我现在需要回答用户关于MySQL的decimal类型是否支持存储负数的问题。首先,我得回忆一下decimal类型的基本知识记得decimal是一种精确数值类型,用于存储固定精度的小数,比如财务数据。用户的问题是是否支持负数,所以应该先确认其默认行为。根据引用内容,引用1提到decimal默认不限制正负,但可以添加约束。引用2则说存储负数可能报错,但通常是因为数据类型或范围问题。引用3和4详细说明存储方式,包括负数如何存储,比如取反操作。这说明decimal本身是支持负数的,但可能存在约束导致无法存储。接下来需要整理这些信息。首先,明确decimal本身支持负数,但用户可能通过约束限制。然后,存储负数时的注意事项,比如精度和小数位数的定义是否足够。例如,如果定义为decimal(5,2),范围是-999.99到999.99,所以负数是可以的。如果用户遇到错误,可能是约束导致,比如CHECK约束或unsigned属性。还需要检查用户提供的引用是否正确。引用3提到负数存储是通过取反正数,这说明底层支持。引用4中的例子也没有提到限制负数,只是存储结构。因此,结论应该是decimal支持负数,除非显式设置约束。 可能用户遇到的问题是他们或同事在定义表时添加了非负约束,导致无法存储负数。需要提醒用户检查表结构是否有CHECK(column >=0)或者使用unsigned关键字,但根据MySQL文档,decimal的unsigned已在8.0.17弃用,所以现在可能用check约束。最后,组织回答结构:先直接回答问题,支持;然后解释存储机制,如何定义列,可能出现的错误原因,以及如何添加非负约束。同时根据引用中的信息,引用相关部分来增强可信度。</think>MySQL的Decimal类型**支持存储负数**,但可以通过约束条件限制其存储范围。以下是具体说明: --- ### 一、Decimal类型的默认行为 1. **支持正负数** Decimal类型本身不限制正负,例如定义`DECIMAL(10,2)`时,取值范围为`-99999999.99`到`99999999.99`,可以存储任意正负数[^3][^4]。 2. **存储原理** MySQL通过**二进制补码取反**的方式存储负数。例如,存储`-123.45`时,会先将正数`123.45`转换为字节序列,再对每个字节取反[^3]。 --- ### 二、存储负数的常见问题 如果存储负数时报错,可能是以下原因: 1. **显式约束** 如果列定义中包含`UNSIGNED`属性或`CHECK`约束(如`CHECK(col >= 0)`),则禁止存储负数[^1][^2]。 ```sql CREATE TABLE example ( amount DECIMAL(10,2) UNSIGNED -- 禁止负数 ); ``` 2. **范围溢出** 当数值超出定义的精度范围时,例如`DECIMAL(3,1)`的合法范围为`-99.9`到`99.9`,若存入`-100.0`会报错。 --- ### 、如何限制Decimal列为非负数 若需禁止负数,可通过以下方式: 1. **添加`CHECK`约束** ```sql CREATE TABLE financial ( balance DECIMAL(10,2) CHECK (balance >= 0) -- 强制非负 ); ``` 2. **弃用的`UNSIGNED`属性** MySQL 8.0.17已弃用`DECIMAL UNSIGNED`语法,建议改用`CHECK`约束[^1][^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值