iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Mariadb表约束及三范式是什么
  • 761
分享到

Mariadb表约束及三范式是什么

2023-06-27 10:06:56 761人浏览 独家记忆
摘要

今天小编给大家分享一下Mariadb表约束及三范式是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。数据库三大范式范式(N

今天小编给大家分享一下Mariadb表约束及三范式是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

Mariadb表约束及三范式是什么

数据库三大范式

范式(NF):设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。但是有些时候一昧的追求范式减少冗余,反而会降低数据读写的效率,这个时候就要反范式,利用空间来换时间。可以把它粗略地理解为一张数据表的表结构所符合的某种设计标准的级别

1NF

即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只要数据库是关系型数据库(mysql/oracle/db2/infORMix/sysbase/SQL Server),就自动的满足1NF。数据库表的每一列都是不可分割的原子数据项,而不能是集合数组,记录等非原子数据项。如果实体中的某个属性有多个值时,必须拆分为不同的属性 。通俗理解即一个字段只存储一项信息。

Mariadb表约束及三范式是什么 

以上,就不符合第一范式,因为进货、销售还可以再分为,进货数量、进货单位、销售单位、销售数量等,以下则满足了第一范式。

Mariadb表约束及三范式是什么
2NF

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情;

例如:订单表只描述订单相关的信息,所以所有字段都必须与订单id相关;产品表只描述产品相关的信息,所以所有字段都必须与产品id相 关;因此不能在一张表中同时出现订单信息与产品信息;如下图所示:

Mariadb表约束及三范式是什么
3NF

必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,表中的每一列只能依赖于主键。

例如:订单表中需要有客户相关信息,在分离出客户表之后,订单表中只需要有一个用户id即可,而不能有其他的客户信息。因为其他的客户信息直接关联于用户id,而不是直接与订单id直接相关。

Mariadb表约束及三范式是什么

各种约束

约束是用来限定表中数据准确性、完整性、一致性、联动性的一套规则。在Mysql中,约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息。如下图:

Mariadb表约束及三范式是什么
Mariadb学习总结(五):数据库表约束及三范式Mariadb学习总结(五):数据库表约束及三范式
NOT NULL

非空约束,是否允许该列的值为NULL,这里有一点很重要,很多字段(除了时间?)默认值如果不指定的话都是NULL,所以除了NULL=NULL,其他值并不等于NULL,比如“”、0等。

修改一个字段为NOT NULL:

MariaDB [mydb]> DESC user;+----------+-------------+------+-----+---------------------+----------------+| Field    | Type        | Null | Key | Default             | Extra          |+----------+-------------+------+-----+---------------------+----------------+| id       | int(11)     | NO   | PRI | NULL                | auto_increment || username | varchar(10) | NO   |     | NULL                |                || passWord | varchar(10) | NO   |     | NULL                |                || regtime  | timestamp   | NO   |     | CURRENT_TIMESTAMP   |                || logtime  | timestamp   | NO   |     | 0000-00-00 00:00:00 |                || logip    | varchar(20) | YES  |     | NULL                |                |+----------+-------------+------+-----+---------------------+----------------+6 rows in set (0.00 sec)MariaDB [mydb]> ALTER TABLE user MODIFY logip varchar(20) NOT NULL;Query OK, 5 rows affected, 5 warnings (0.04 sec)  Records: 5  Duplicates: 0  Warnings: 5MariaDB [mydb]> DESC user;+----------+-------------+------+-----+---------------------+----------------+| Field    | Type        | Null | Key | Default             | Extra          |+----------+-------------+------+-----+---------------------+----------------+| id       | int(11)     | NO   | PRI | NULL                | auto_increment || username | varchar(10) | NO   |     | NULL                |                || password | varchar(10) | NO   |     | NULL                |                || regtime  | timestamp   | NO   |     | CURRENT_TIMESTAMP   |                || logtime  | timestamp   | NO   |     | 0000-00-00 00:00:00 |                || logip    | varchar(20) | NO   |     | NULL                |                |+----------+-------------+------+-----+---------------------+----------------+6 rows in set (0.01 sec)

这里还有一个问题,对于默认值为NULL但是又没有指定插入这个字段:

MariaDB [mydb]> DESC user;+----------+-------------+------+-----+---------------------+----------------+| Field    | Type        | Null | Key | Default             | Extra          |+----------+-------------+------+-----+---------------------+----------------+| id       | int(11)     | NO   | PRI | NULL                | auto_increment || username | varchar(10) | NO   |     | NULL                |                || password | varchar(10) | NO   |     | NULL                |                || regtime  | timestamp   | NO   |     | CURRENT_TIMESTAMP   |                || logtime  | timestamp   | NO   |     | 0000-00-00 00:00:00 |                || logip    | varchar(20) | YES  |     | NULL                |                |+----------+-------------+------+-----+---------------------+----------------+//看username这个字段,默认值为NULL,不允许NULLMariaDB [mydb]> INSERT INTO user(password) VALUES('test7');Query OK, 1 row affected, 1 warning (0.00 sec)//这里看到我们插入成功了。MariaDB [mydb]> SELECT * FROM user WHERE password='test7';+----+----------+----------+---------------------+---------------------+-------+| id | username | password | regtime             | logtime             | logip |+----+----------+----------+---------------------+---------------------+-------+| 12 |          | test7    | 2018-02-25 15:25:14 | 0000-00-00 00:00:00 | NULL  |+----+----------+----------+---------------------+---------------------+-------+1 row in set (0.00 sec)

可以看到username这一列的值为空字符,而它的默认值为NULL啊, 而logip默认值为NULL,但是允许插入NULL值,所以这里显示了NULL值。

查了一下~因为NULL为默认值,但是又不允许NULL值,所以,也就是说现在username这个字段没有值,因为sql_MODE的原因,只会警告一下并不会直接报错,当我们指定SQL_MODE为’STRICT_ALL_TABLES’时,此时插入就会报如下错误:

MariaDB [mydb]> INSERT INTO user(password) VALUES('test88');ERROR 1364 (HY000): Field 'username' doesn't have a default value
UNIQUE

unique代表唯一约束:唯一约束是指定table的列或列组合不能重复,保证数据的唯一性,虽然唯一约束不允许出现重复的值,但是可以为多个null,同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同,mysql会给唯一约束的列上默认创建一个唯一索引

添加唯一约束:

MariaDB [mydb]> ALTER TABLE user ADD CONSTRAINT uq_username UNIQUE(username);  //uq_username为约束名称,UNIQUE(可多个字段)//当插入用户名相同的数据事则会直接报错MariaDB [mydb]> INSERT INTO user(username,password) VALUES('test4','test123');ERROR 1062 (23000): Duplicate entry 'test4' for key 'uq_username'//删除此约束MariaDB [mydb]> ALTER TABLE user DROP KEY uq_username;//添加两个字段的约束MariaDB [mydb]> ALTER TABLE user ADD CONSTRAINT uq_user UNIQUE(username,password);//测试添加数据MariaDB [mydb]> SELECT * FROM user;                                                    +----+----------+----------+---------------------+---------------------+-------+| id | username | password | regtime             | logtime             | logip |+----+----------+----------+---------------------+---------------------+-------+|  7 | test2    | test3    | 2018-02-24 16:42:48 | 0000-00-00 00:00:00 |       ||  8 | test3    | test3    | 2018-02-24 16:42:48 | 0000-00-00 00:00:00 |       ||  9 | test4    | test5    | 2018-02-24 16:42:48 | 0000-00-00 00:00:00 |       |+----+----------+----------+---------------------+---------------------+-------+3 rows in set (0.00 sec)MariaDB [mydb]> INSERT INTO user(username,password) VALUES('test4','test123');Query OK, 1 row affected (0.01 sec)//仅当两个字段的数据都相同时才违反唯一约束MariaDB [mydb]> INSERT INTO user(username,password) VALUES('test4','test5');ERROR 1062 (23000): Duplicate entry 'test4-test5' for key 'uq_user'
PRIMARY KEY

主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。如果是多列组合的主键约束, 那么这些列都不允许为空值,并且组合的值不允许重复。每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建,MySQL的主键名总是PRIMARY, 当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。

操作如下:

//因为现在的表中已经有主键了,先把主键删掉MariaDB [mydb]> ALTER TABLE user DROP PRIMARY KEY;ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key//告诉我们一张表里只允许有一个字段为自动增长,且这个字段必须是主键,所以,我们要先取消它的自动增长。MariaDB [mydb]> ALTER TABLE user MODIFY COLUMN id int(11) NOT NULL;Query OK, 4 rows affected (0.07 sec)              Records: 4  Duplicates: 0  Warnings: 0MariaDB [mydb]> DESC user;+----------+-------------+------+-----+---------------------+-------+| Field    | Type        | Null | Key | Default             | Extra |+----------+-------------+------+-----+---------------------+-------+| id       | int(11)     | NO   | PRI | NULL                |       |//再次删除主键MariaDB [mydb]> ALTER TABLE user DROP PRIMARY KEY;Query OK, 4 rows affected (0.03 sec)              Records: 4  Duplicates: 0  Warnings: 0//好了,再让我们把主键加上吧~~~   以下两种方式都可以哦~MariaDB [mydb]> ALTER TABLE user ADD CONSTRAINT PRIMARY KEY(id);MariaDB [mydb]> ALTER TABLE user MODIFY COLUMN id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT;
FOREIGN KEY

外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。 也就是说从表的外键值必须在主表中能找到或者为空,当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据,还有一种就是级联删除子表数据。 注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列,假定引用的主表列不是唯一的记录,那么从表引用的数据就不确定记录的位置,同一个表可以有多个外键约束。

现在,我们创建一个GROUP表吧,用于记录用户的分组信息,

CREATE TABLE `usergroup` ( `id` int(3) NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL, `comment` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf16 |

然后呢~为user表添加一个记录,记录用户属于那个组

MariaDB [mydb]> ALTER TABLE user ADD COLUMN groupid INT(3);Query OK, 0 rows affected (0.05 sec)Records: 0  Duplicates: 0  Warnings: 0

//添加一个外键

ALTER TABLE user ADD CONSTRAINT fk_groupid FOREIGN KEY (groupid) REFERENCES usergroup(id);

//验证外键约束

MariaDB [mydb]> INSERT INTO user(username,password,groupid) VALUES('test99','test00',1);ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`mydb`.`user`, CONSTRAINT `fk_groupid` FOREIGN KEY (`groupid`) REFERENCES `usergroup` (`id`))

//可以为空,但是不可以为参照表中没有的值

MariaDB [mydb]> INSERT INTO user(username,password) VALUES('test99','test00');Query OK, 1 row affected (0.01 sec)

外键定义:

reference_definition:   REFERENCES tbl_name (index_col_name,...)     [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]     [ON DELETE reference_option]     [ON UPDATE reference_option]reference_option:   RESTRICT | CASCADE | SET NULL | NO ACTION

其中一下级联操作需要注意: ON DELETE CASCADE:当删除父(参照)表中的行时,如果子表中有依赖于被删除父行的子行存在,那么连同子行一起删除,不推荐使用。 ON DELETE SET NULL:当删除父(参照)表中的行时,如果子表中有依赖于被删除父行的子行存在,那么不删除,而是将子行的外键列设置为NULL

CHECK

CHECK约束就是当向表中插入一行或更新一行数据时进行CHECK约束检查,CHECK接受一个表达式,如果这个表达式为TRUE则允许插入,如果这个表达式为FALSE则拒绝插入,在MariaDB10.2版本才开始支持CHECK。

常见的CHECK约束有:

CONSTRAINT non_empty_name CHECK (CHAR_LENGTH(name) > 0)CONSTRAINT consistent_dates CHECK (birth_date IS NULL OR death_date IS NULL OR birth_date

例子:检查用户名长度是否大于0

ALTER TABLE user ADD CONSTRAINT non_empty_name CHECK(CHAR_LENGTH(username)>0);INSERT INTO user(id,username) VALUES(1,'');

这个东西看起来很鸡肋的样子,好像一般都是在业务层进行数据判断了,而且数据库嘛~就存数据就好了。

以上就是“Mariadb表约束及三范式是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Mariadb表约束及三范式是什么

本文链接: https://www.lsjlt.com/news/310054.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mariadb表约束及三范式是什么
    今天小编给大家分享一下Mariadb表约束及三范式是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。数据库三大范式范式(N...
    99+
    2023-06-27
  • 一文了解MYSQL三大范式和表约束
    目录 一,什么是范式 二,三大范式的理解1,第一范式(确保每列保持原子性)2,第二范式(保证每列都和主键相关)3,第三范式(保证每列和主键直接相关,不能间接相关)4,表的关系(1)一...
    99+
    2024-04-02
  • MariaDB中的主键约束是什么
    在MariaDB中,主键约束是一种唯一性约束,用于确保表中的每一行都有一个唯一的标识符。主键约束可以由一个或多个字段组成,这些字段的...
    99+
    2024-04-09
    MariaDB
  • sql检查约束表达式的语法是什么
    SQL检查约束表达式可以使用以下语法写:CREATE TABLE table_name (    column1...
    99+
    2023-10-12
    sql
  • oracle的表级约束和列级约束有什么区别
    表级约束和列级约束都是用来保证数据的完整性和一致性的约束条件,但它们之间有一些区别: 表级约束是针对整个表的约束条件,而列级约束是...
    99+
    2024-04-20
    oracle
  • 数据库三范式和反范式是什么
    这篇文章主要介绍了数据库三范式和反范式是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在日常开发过程中,我们需要对Mysql数据库进行操...
    99+
    2024-04-02
  • SQL CHECK约束表达式怎么写
    SQL CHECK约束用于限制列中的值必须满足指定的条件。CHECK约束可以在创建表时定义,也可以在修改表时添加。CHECK约束的语...
    99+
    2023-10-12
    SQL
  • 什么是数据库三范式
    这篇文章主要讲解了“什么是数据库三范式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是数据库三范式”吧!书上讲了好多, 归结起来3句话: 1NF:字段不...
    99+
    2024-04-02
  • mysql约束条件是什么
    MySQL约束条件是用于限制表中数据的规则。它们可以确保数据的完整性和一致性。常见的约束条件包括:1. 主键约束:保证表中每一行都有...
    99+
    2023-08-31
    mysql
  • MySQL六种约束是什么
    本文小编为大家详细介绍“MySQL六种约束是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL六种约束是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是约束作用于表上的规则,限制存储在表中的数...
    99+
    2023-07-05
  • oracle约束的作用是什么
    Oracle约束是用来确保表中数据的完整性和一致性的规则或条件。它们可以限制表中数据的类型、大小和格式,以及确保数据之间的关系和一致...
    99+
    2024-03-04
    oracle
  • mysql中常见的约束是什么
    这篇文章主要为大家展示了“mysql中常见的约束是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql中常见的约束是什么”这篇文章吧。常见约束NOT NULL:非空,该字段的值必填UNI...
    99+
    2023-06-20
  • mysql外键约束是什么意思
    MySQL外键约束指的是对表与表之间的关系进行限制的一种约束,可以在一个表中定义一个列,这个列将引用另外一个表中的列,这种关联关系可以确保数据的完整性和一致性。本教程操作系统:Windows10系统、mysql 8.0版本、Dell G3电...
    99+
    2023-07-10
  • SQL UNIQUE约束的作用是什么
    SQL UNIQUE约束用于确保表中的某个列(或一组列)的值是唯一的。具体来说,UNIQUE约束可以用于以下几种情况:1. 单列唯一...
    99+
    2023-09-05
    SQL
  • 什么是 MySQL UNIQUE 约束以及我们如何将其应用于表的字段?
    顾名思义,MySQL UNIQUE 约束维护表中列的唯一性,并且不允许插入重复值。基本上,UNIQUE 约束创建一个索引,使得索引列中的所有值都必须是唯一的。这里值得一提的是,MySQL 表中可以有多个 UNIQUE 列。我们可以通过在定义...
    99+
    2023-10-22
  • SQL中check约束的作用是什么
    Check约束是一种用于限制表中列的取值范围的约束。它可以被用来限制列中的值必须满足某种条件,例如限制列中的值必须大于0,或者必须在...
    99+
    2024-04-09
    SQL
  • sql中外键约束是什么意思
    外键约束是 sql 数据库完整性规则,用于确保表中的列与另一张表中的主键列关联。外键约束通过强制引用完整性来确保数据准确性和一致性,改善数据结构,并优化查询性能。可以使用 foreign...
    99+
    2024-05-02
  • C#泛型的一般约束是什么
    本篇内容主要讲解“C#泛型的一般约束是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#泛型的一般约束是什么”吧!C# 泛型约束中的一般约束使用 C# 泛型,编译器会将一般代码编译为 IL,...
    99+
    2023-06-17
  • sql唯一约束的作用是什么
    小编给大家分享一下sql唯一约束的作用是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SQL中唯一约束的作用是保证每个记录中...
    99+
    2024-04-02
  • MySQL约束与索引概念是什么
    这篇“MySQL约束与索引概念是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQ...
    99+
    2023-04-14
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作