数据库的约束

//数据库的约束

  约束是针对于数据库中输入数据时进行作用,进而限制输入的内容的范围。

数据库中的几类约束---约束是在创建表时针对列进行约束,在输入/修改数据时进行限制

 1.not null----约束列是否为空

     not null的使用

    表示在str表中进行输入数据时,a列不能为空

 

   通过观察表的结构,可知在NULL(是否可为空)处,为NO,表示此列不能为空

2.unique----约束输入/修改列中值时是否唯一存在

     由此图可知,当在stm表中的a列重复输入1时,会报错,Duplicate entry ‘1’ for key ‘a’ 表示重复的1被输入到被key(键)修饰的a的列中

 通过观察stm表的结构,可知在Key处为UNI ,UNI表示唯一约束键

3.default----设置列的默认值

   可知未进行default操作的表未进行输入值时,默认值为null

  在创建表示,通过default对列进行约束,将a列的默认值修改为0,将b列的默认值修改为h

4.PRIMARY KEY---主键,在表中用于对行进行‘身份标识’操作

   在表中的每一条行都是一条记录,例如在表中输入人的信息时,创建一个有两列的表,一列为人名,一列为身份证号码,身份证号码即可作为人的身份标识(身份标识必须是唯一的(一定存在,且一定不重复)),所以主键也可视为具有unique+not null的功能

   PRI表示为主键约束

  注意一个表中只能有一个主键

 在上述设置主键时,各行的标识符都是通过设计者自己输入的,但也可让系统自动生成,通过在primary key后加auto_increment关键字表示该主键是一个自增主键

 自增主键默认从1开始增加,每次加1

注:若将一个表中的自增的这几行删除,再次添加数据,则自增从被删除的下一个数字开始,不会再从一开始自增,因为自增的数字被使用了,另外在自增时,若手动设置一个标识符(注意设置在自增数字之后的数字,若下述图设置1标识符,则自增是从6开始自增),则之后的自增从手动标识符开始向后自增

若该列被自增主键修饰,则在输入数据时在对应位置输入null,即表示让系统对该列进行自增

5. foreign key 外键---用于对不同表之间进行约束

  外键的使用

注意外键的使用与其他约束键使用的区别:外键是在创建表的所有列之后进行声明的,foreign key (列名)  references 表名 (列名) ,表明该表的(列名)被references后的 表名的(列名)所约束

此处students表的中的classId列被class表中的classId列所约束,通过外键将两表中的classId列与classId列进行联系

students受到class的约束,就把class叫做students的父表(parent),students就是class的子表(child)

此行数据可被成功输入,因为创建students表时,该表被外键修饰的列所要输入的数据必须要属于父表中被关联的列中的数据,该图中输入子表对应的classId列的数据1在父表classId中存在,所以可成功输入

该图中输入子表对应的classId列的数据4在父表classId中不存在,所以报错

在子表中输入/修改关于被外键联系的列的数据时,首先会判断所操作的被外键联系的列的数据是否在父表中被联系的该列中存在,若存在,则可成功进行操作,否则报错,对于输入/修改没被外键联系的列的数据时,则无影响

对于父表和子表,若要修改父表中被外键关联的列的数据时,若在子表中被外键关联的列中包含父表相关列的数据时,则父表中被包含数据的行的相关列数据不能修改

举例:

在子表中被外键关联的列中包含父表相关列classId为1的数据,所以在修改父表时,若修改关于classId=1的行中classId的值会报错,但若修改className则无影响

在子表中被外键关联的列中包含父表相关列classId为1的数据,在修改父表时,若修改不包含classId=1行的列的数据,则可行

注意:在使用外键时,子表中被关联的列要被unique或primary key约束(确保唯一性),否则无法使用外键

 子表中被关联的列未确保唯一性

子表中被关联的列通过unique确保唯一性

子表中被关联的列通过primary key确保唯一性

<think>好的,我需要帮助用户了解数据库约束规则的定义、修改以及如何确保数据完整性。首先,我需要回顾一下数据库约束的基本概念和种类,确保自己理解正确。根据用户提供的引用,数据库完整性约束主要包括实体完整性、参照完整性、域完整性和用户定义的完整性四种。 首先,数据库约束的定义。用户可能想知道如何创建这些约束,比如在创建表的时候如何添加主键、外键等。引用中提到约束可以通过CREATE TABLE或ALTER TABLE语句来定义,所以需要具体说明这些语句的用法,并举例说明,比如主键约束的添加方式。 接下来是修改约束。用户可能想了解如何更改现有的约束,比如添加新的约束或删除旧的。需要提到使用ALTER TABLE语句来添加或删除约束,并给出例子,例如添加检查约束或删除外键约束。需要注意的是,某些数据库系统可能不允许直接修改约束,而是需要先删除再重新创建,这一点也要提到。 然后是数据完整性的部分。用户想知道如何通过约束来确保数据准确性。需要分点说明各种约束如何维护完整性,例如主键确保唯一性,外键维护关联性,检查约束保证数据符合条件等。引用中的信息提到约束可以防止错误数据插入,提高可靠性,这些都需要整合到回答中。 还需要注意用户提供的引用内容,确保回答中正确引用来源。例如,实体完整性和参照完整性的定义来自引用2和引用4,而约束的作用来自引用3和引用4。在回答中引用这些内容时,要在段落末尾添加对应的引用标识,如[^2]、[^3]等。 另外,用户的问题可能涉及到实际操作,比如SQL语句的具体写法。因此,提供示例代码是很重要的,但根据用户的要求,行内数学表达式需要用$...$,而独立公式用$$...$$。不过在这个问题中可能更多的是SQL示例,所以需要用代码块来展示,比如使用反引号包裹SQL语句。 最后,生成相关问题部分需要考虑用户可能进一步询问的方向,比如约束的种类、如何选择约束类型、修改约束的注意事项,以及约束与触发器的区别等。这些问题需要与数据库约束相关,并且能够帮助用户深入理解主题。 现在需要组织这些信息,确保结构清晰,分点回答定义、修改、数据完整性三个部分,每个部分给出解释和示例,同时正确引用来源。检查是否有遗漏的约束类型或关键点,确保覆盖用户的需求。</think>### 数据库约束规则的定义、修改与数据完整性 #### 一、数据库约束的定义 数据库约束是用于限制表中数据规则的条件,确保数据的准确性、一致性和可靠性。主要约束类型包括: 1. **实体完整性约束** 通过主键(PRIMARY KEY)确保每行数据的唯一性。例如: ```sql CREATE TABLE Students ( StudentID INT PRIMARY KEY, Name VARCHAR(50) ); ``` 2. **参照完整性约束** 通过外键(FOREIGN KEY)维护表之间的关联关系。例如: ```sql CREATE TABLE Orders ( OrderID INT PRIMARY KEY, StudentID INT, FOREIGN KEY (StudentID) REFERENCES Students(StudentID) ); ``` 3. **域完整性约束** 通过数据类型、非空(NOT NULL)和检查约束(CHECK)限制列的取值范围。例如: ```sql CREATE TABLE Employees ( Age INT CHECK (Age >= 18), Email VARCHAR(100) NOT NULL ); ``` 4. **用户定义完整性约束** 自定义规则,例如触发器或存储过程,用于复杂逻辑验证[^4]。 --- #### 二、约束的修改 数据库约束可通过以下方式动态调整: 1. **添加约束** 使用 `ALTER TABLE` 添加新的约束: ```sql ALTER TABLE Employees ADD CONSTRAINT CHK_Salary CHECK (Salary > 0); ``` 2. **删除约束** 删除不再需要的约束: ```sql ALTER TABLE Orders DROP CONSTRAINT FK_StudentID; ``` 3. **修改约束** 某些数据库(如MySQL)不支持直接修改约束,需先删除再重建: ```sql -- 删除旧约束 ALTER TABLE Employees DROP CONSTRAINT CHK_Salary; -- 添加新约束 ALTER TABLE Employees ADD CONSTRAINT CHK_Salary CHECK (Salary >= 1000); ``` --- #### 三、约束与数据完整性 约束通过以下机制确保数据质量: 1. **唯一性**:主键和唯一约束防止重复数据。 2. **关联性**:外键约束确保跨表数据引用有效[^1]。 3. **有效性**:检查约束和数据类型过滤非法值(如负数年龄)。 4. **强制性**:非空约束避免关键字段缺失。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值