MySQL基础笔记(二) 完整性约束

我们知道,一种数据模型必须包含三个基本的部分:

  • 构造机制(数据结构):主要描述数据的类型、内容、性质以及数据间的联系等。
  • 运算机制(数据操作):主要描述在相应的数据结构上的操作类型和操作方式。
  • 约束机制(数据约束):主要描述数据结构内数据间的语法、词义联系、他们之间的制约和依存关系,以及数据动态变化的规则,以保证数据的正确、有效和相容。

作为数据库的一种数据模型,关系模型提供了一组完整性规则或限制。完整性约束用于确定关系数据库里数据的准确性和一致性。

在关系型数据库里,完整性约束包括域完整性实体完整性引用完整性以及用户定义完整性

一、完整性约束的概念

1.1 域完整性

域完整性,是指给定列的取值范围(即输入的有效性),比如性别取值应为男或女。

强制域有效性的方法有:限制类型(通过数据类型)、格式(通过 CHECK 约束和规则)或可能值的范围(通过 FOREIGN KEY 约束、CHECK 约束、DEFAULT 定义、NOT NULL 定义和规则)。

1.2 实体完整性

实体完整性,是指使用主键来唯一地标识一个实体。

在关系数据库中,一条记录代表一个实体。而实体是可以相互区分、识别的,也即它们应具有某种唯一性标识(该标识不能取相同的值,也不能为空)。

实体完整性强制表的标识符列或主键的完整性(通过索引、UNIQUE 约束、PRIMARY KEY 约束或 IDENTITY 属性)。

1.3 引用完整性

引用完整性,就是定义外键与主键之间的引用规则。

假设有两个关系:

Student (stuID, name, sex, age, classID);
Class (classID, amount, teacherName);

其中 classID 是关系 Student 的外键,它引用了关系 Class 里的 classID 。这个外键确保了关系 Student 里的每个 classID 都在关系 Class 中有对应的 classID 。在输入或删除记录时,引用完整性保持表之间已定义的关系:

  • 为了在 Student 中插入一条记录,其 classID 首先要存在于 Class 中。
  • Class 中删除一条记录,则 Student classID 值对应的记录必须全部被删除。

引用完整性基于外键与主键之间或外键与唯一键之间的关系(通过 FOREIGN KEY 和 CHECK 约束)。引用完整性确保键值在所有表中一致。这样的一致性要求不能引用不存在的值,如果键值更改了,那么在整个数据库中,对该键值的所有引用要进行一致的更改。

1.4 用户定义完整性

用户定义完整性让用户可以定义不属于其它任何完整性分类的特定业务规则。所有的完整性类型都支持用户定义完整性(CREATE TABLE 中的所有列级和表级约束、存储过程和触发器)。

二、MySQL中的约束

不同的数据库产品对完整性约束的支持程度不一样,但基本的完整性约束都是支持的。相信以后会越来越完善。

2.1 主键约束

主键,又称主码,是表中一列或多列的组合,能够唯一地标识表中的一条记录。主键约束(Primary Key Constraint)要求主键列的数据唯一,且不允许为空。

在创建表的过程中添加一个字段的主键约束:

CREATE TABLE employees (
    id INT(11) AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    deptId INT(3) NOT NULL,
    salary FLOAT NOT NULL
);
CREATE TABLE employees (
    id INT(11) AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    deptId INT(3) NOT NULL,
    salary FLOAT NOT NULL,
    PRIMARY KEY(id)
);

注意:AUTO_INCREMENT表示自增,默认初始值为1。

也可以使用多个字段的组合作为主键:

CREATE TABLE employees (
    name VARCHAR(20) NOT NULL,
    deptId INT(3) NOT NULL,
    salary FLOAT NOT NULL,
    PRIMARY KEY(name, deptId)
);

另外,也可以在建表之后使用ALTER添加主键约束:

CREATE TABLE employees (
    name VARCHAR(20) NOT NULL,
    deptId INT(3) NOT NULL,
    salary FLOAT NOT NULL,
);

ALTER TABLE employees ADD CONSTRAINT emp_pk PRIMARY KEY(name, deptId);

2.2 唯一性约束

唯一性约束(Unique Constraint)要求表里某个字段的值在每条记录里都是唯一的,这一点与主键类似。声明为 UNIQUE 的字段允许为空,但只能出现一个空值。

CREATE TABLE department(
    deptId INT(3) PRIMARY KEY,
    name VARCHAR(20) UNIQUE,
    location VARCHAR(50)
);
CREATE TABLE department(
    deptId INT(3) PRIMARY KEY,
    name VARCHAR(20),
    location VARCHAR(50),
    UNIQUE(name)
);

2.3 外键约束

外键(Foreign Key):首先它是表中的一个字段,它可以不是本表的主键,但必须对应另外一个表的主键。外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。

外键约束是确保表与表之间引用完整性的主要机制。一个表可以有一个或多个外键。通常,我们把外键所在的表称为子表,外键所引用的表称为父表

CREATE TABLE employees(
    id INT(11) PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    deptId INT(3) NOT NULL,
    salary FLOAT NOT NULL,
    CONSTRAINT emp_fk FOREIGN KEY(deptId) REFERENCES department(deptId)
);

或者

ALTER TABLE employees ADD CONSTRAINT emp_fk FOREIGN KEY(deptId) REFERENCES department(deptId);

2.4 非空约束

非空约束(Not Null Constraint)指字段的值不能为空。对于使用了 NOT NULL 约束的字段,如果用户在添加数据时没有指定值,数据库系统会报错。

CREATE TABLE employees (
    id INT(11) PRIMARY KEY,
    name VARCHAR(20),
    deptId INT(3),
    salary FLOAT
);

添加非空约束:

ALTER TABLE employees MODIFY name varchar(20) NOT NULL;

取消非空,并添加默认值:

ALTER TABLE employees MODIFY name varchar(20) DEFAULT 'abc';

2.5 检查约束

检查约束(Check Constraint)用于检查输入到特定字段的数据的有效性。MySQL不支持check约束,但可以使用check约束,而没有任何效果。

CREATE TABLE employees (
    id INT(11) PRIMARY KEY,
    name VARCHAR(20),
    age INT(3),
    CONSTRAINT age_chk CHECK(age>18)
);

上面 check 约束要求 age 必须大于18,但插入数据时却没有起到任何作用。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL完整性约束是用来确保数据库的数据符合特定规则或条件的约束。这些约束可以分为以下几种类型: 1. 唯一约束:唯一约束用于确保列或列的组合的值是唯一的。可以通过在创建表时使用`UNIQUE`关键字来定义唯一约束,也可以使用`ALTER TABLE`语句添加唯一约束。例如,`ALTER TABLE employee ADD UNIQUE (e_name);` 2. 主键约束:主键约束用于唯一标识表的每一行数据。主键必须是唯一且非空的。可以通过在创建表时使用`PRIMARY KEY`关键字来定义主键约束。例如,`CREATE TABLE employee (e_id INT PRIMARY KEY, e_name VARCHAR(5), e_sex VARCHAR(5), e_age INT, d_id INT);` 3. 外键约束:外键约束用于确保表之间的关系的完整性。外键约束在一个表创建,指向另一个表的主键。可以通过在创建表时使用`REFERENCES`关键字定义外键约束,也可以使用`ALTER TABLE`语句添加外键约束。例如,`ALTER TABLE employee ADD CONSTRAINT fk_d_id FOREIGN KEY (d_id) REFERENCES department (d_id);` 4. 检查约束:检查约束用于确保列的值满足特定条件。可以在创建表时使用`CHECK`关键字来定义检查约束,也可以使用`ALTER TABLE`语句添加检查约束。例如,`ALTER TABLE employee ADD CONSTRAINT ch_e_age CHECK (e_age >= 0);` 综上所述,MySQL完整性约束包括唯一约束、主键约束、外键约束和检查约束,用于确保数据库的数据符合特定规则或条件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MySQL完整性约束](https://blog.csdn.net/kejiayuan0806/article/details/100766658)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值