16.约束关系

一、主键约束

1.1 表级创建

create table mydept(id number, dept_name varchar2(20),constraint pk_id primary key(id));

1.2 列级创建

create table mydept(id number constraint id_pk primary key,dept_name varchar2(20));

二、非空约束

create table mydept(id number not null,dept_name varchar2(20) not null);

三、唯一性约束

3.1 表级创建

create table mydept(id number,dept_name varchar2(20),constraint id_un unique(id));

3.2 列级创建

create table mydept(id number constraint id_un unique,dept_name varchar2(20));

四、检查约束

4.1 表级创建

create table mydept(id number,dept_name varchar2(20),constraint id_ck check(id>0));

4.2 列级创建

create table mydept(id number constraint id_ck check(id>0),dept_name varchar2(20));

五、外键约束

5.1 表级实现同时设置级联删除

create table myemp (id number,name varchar2(20),dept_id number,constraint fk_dept_id foreign key(dept_id) references mydept(id) on delete cascade)

5.2 表级实现同时设置级联置空

create table myemp (id number,name varchar2(20),dept_id number,constraint fk_dept_id foreign key(dept_id) references mydept(id) on delete set null);

5.3 列级实现同时设置级联删除

create table myemp(id number,name varchar2(20),dept_id number constraint fk_dept_id references mydept(id) on delete cascade);

5.4 列级实现同时设置级联置空

create table myemp(id number,name varchar2(20),dept_id number constraint fk_dept_id references mydept(id) on delete set null);

































<think>好的,我现在需要处理用户关于“完整性约束:表约束和键约束”的问题。首先,用户之前询问了ACID特性,现在继续深入数据库的完整性约束,说明他们可能在系统学习数据库相关知识,或者需要为项目设计数据库结构。 用户提到的是完整性约束中的表约束和键约束。我需要先回忆这两个概念的定义和区别。表约束通常指的是应用于表中数据列的规则,确保数据满足特定条件,比如CHECK约束、NOT NULL约束等。而键约束则涉及主键、外键、唯一键等,用于维护数据的唯一性和关系完整性。 接下来,需要确定用户可能的背景。如果用户是学生,可能需要详细且结构化的解释;如果是开发者,可能需要实际应用例子和实现方式。由于用户之前的问题是关于ACID,可能更偏向理论,但结合完整性约束,可能需要兼顾理论和实践。 需要确保回答覆盖以下几点: 1. 完整性约束的定义和作用。 2. 表约束的具体类型和例子,比如CHECK、DEFAULT、NOT NULL。 3. 键约束的类型,如主键、外键、唯一键,并说明各自的作用。 4. 两者的区别和联系,以及在实际数据库设计中的应用场景。 5. 可能的实现方式,比如在SQL中如何声明这些约束。 6. 结合用户之前的ACID问题,可以提到一致性(Consistency)如何通过这些约束来保证。 另外,用户可能容易混淆表约束和键约束,需要明确区分两者的范围。例如,主键约束既是键约束,也可以视为表约束的一种,因为它是在表级别定义的。 需要注意用简洁明了的语言,避免过于技术化,同时提供示例帮助理解。例如,创建表时的SQL语句示例,说明如何添加CHECK约束或主键约束。 可能还需要提到约束的验证时机,比如在插入或更新数据时,数据库会自动检查这些约束,确保数据完整性。这与ACID中的一致性相关,可以呼应之前的回答,增强知识的连贯性。 最后,总结部分要强调表约束和键约束在数据库设计中的重要性,以及它们如何共同维护数据的正确性和可靠性。可能还要提及违反约束的处理方式,比如抛出错误或回滚事务,这又联系到事务的原子性。 检查是否有遗漏点,比如是否覆盖了所有常见的约束类型,是否每个部分都有清晰的例子,以及是否解答了用户潜在的深层需求,比如如何在实际中应用这些约束来设计健壮的数据库结构。</think>以下是关于数据库 **完整性约束**(尤其是 **表约束** 和 **键约束**)的详细介绍: --- ### **1. 完整性约束的作用** 完整性约束是数据库中用于**强制数据正确性**的规则,确保数据符合业务逻辑和现实世界的规则。主要分为两类: - **表约束**:针对表中列的取值限制。 - **键约束**:定义表中数据的唯一性和关系。 --- ### **2. 表约束(Table Constraints)** 表约束直接作用于表的列,限制列中存储的数据值。常见类型包括: #### **① `NOT NULL` 约束** - **作用**:禁止列存储空值(NULL)。 - **示例**: ```sql CREATE TABLE Students ( StudentID INT NOT NULL, Name VARCHAR(50) NOT NULL ); ``` #### **② `CHECK` 约束** - **作用**:限定列的取值范围。 - **示例**:限制年龄必须大于 0。 ```sql CREATE TABLE Employees ( Age INT CHECK (Age > 0), Salary DECIMAL CHECK (Salary >= 0) ); ``` #### **③ `DEFAULT` 约束** - **作用**:当插入数据未指定值时,自动填充默认值。 - **示例**: ```sql CREATE TABLE Orders ( OrderDate DATE DEFAULT CURRENT_DATE ); ``` #### **④ `UNIQUE` 约束** - **作用**:确保列(或列组合)的值唯一,但允许存在 NULL 值。 - **示例**: ```sql CREATE TABLE Users ( Email VARCHAR(100) UNIQUE -- 邮箱不可重复 ); ``` --- ### **3. 键约束(Key Constraints)** 键约束通过定义主键、外键等,维护数据的唯一性和表间关系。 #### **① 主键约束(Primary Key)** - **作用**:唯一标识表中的每一行,**不可重复且不能为 NULL**。 - **示例**: ```sql CREATE TABLE Products ( ProductID INT PRIMARY KEY, -- 主键 ProductName VARCHAR(100) ); ``` #### **② 外键约束(Foreign Key)** - **作用**:建立表与表之间的关联,确保引用其他表的主键值存在。 - **示例**:订单表引用客户表的 `CustomerID`。 ```sql CREATE TABLE Orders ( OrderID INT PRIMARY KEY, CustomerID INT, FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) ); ``` #### **③ 唯一键约束(Unique Key)** - **作用**:类似主键,但允许 NULL 值,且一个表可以有多个唯一键。 - **示例**: ```sql CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY, PassportNumber VARCHAR(20) UNIQUE -- 唯一但可为 NULL ); ``` --- ### **4. 表约束 vs. 键约束** | **特性** | **表约束** | **键约束** | |----------------|------------------------------------|-------------------------------| | **核心目标** | 限制列的取值范围 | 维护数据唯一性和表间关系 | | **常见类型** | `NOT NULL`, `CHECK`, `DEFAULT` | 主键、外键、唯一键 | | **是否可为空** | 允许(如非 `NOT NULL` 约束) | 主键不可为空,外键可为空 | | **是否唯一** | 不强制(除非使用 `UNIQUE` 约束) | 主键和唯一键强制唯一 | --- ### **5. 约束的实现方式** #### **① 列级约束** 直接在列定义中声明: ```sql CREATE TABLE TableName ( Column1 INT PRIMARY KEY, Column2 VARCHAR(50) NOT NULL ); ``` #### **② 表级约束** 在表定义末尾统一声明(适合多列组合约束): ```sql CREATE TABLE TableName ( Column1 INT, Column2 VARCHAR(50), PRIMARY KEY (Column1), CHECK (Column1 > 0 AND Column2 IS NOT NULL) ); ``` --- ### **6. 实际应用示例** **场景:设计一个“学生-课程”选课系统** ```sql -- 学生表(主键约束、非空约束) CREATE TABLE Students ( StudentID INT PRIMARY KEY, Name VARCHAR(50) NOT NULL, Age INT CHECK (Age >= 16) ); -- 课程表(唯一键约束) CREATE TABLE Courses ( CourseID INT PRIMARY KEY, CourseCode VARCHAR(10) UNIQUE -- 课程编号唯一 ); -- 选课表(外键约束、联合主键) CREATE TABLE Enrollments ( StudentID INT, CourseID INT, PRIMARY KEY (StudentID, CourseID), -- 联合主键 FOREIGN KEY (StudentID) REFERENCES Students(StudentID), FOREIGN KEY (CourseID) REFERENCES Courses(CourseID) ); ``` --- ### **7. 约束的验证时机** - **插入/更新数据时**:数据库自动检查约束,违反则拒绝操作。 - **删除数据时**:外键约束可能阻止删除被引用的主键数据(除非使用级联删除)。 --- ### **总结** - **表约束**:控制数据的合法性(如范围、非空、默认值)。 - **键约束**:保障数据唯一性和表间引用完整性。 - **共同目标**:维护数据库的**一致性**(ACID 中的 Consistency),防止脏数据产生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值