3.3 数据定义

思维导图:

前言:

****核心概念**:

  • 关系数据库支持**三级模式结构**:模式、外模式、内模式。
  • 这些模式中包括了如:模式、表、视图和索引等基本对象。
  • SQL的数据定义功能主要包括了模式定义、表定义、视图和索引的定义。**

---

**1. SQL的数据定义语句**

****重点**:

  • SQL标准**不提供**修改模式定义和修改视图定义的操作。要修改,需先删除后重建。
  • 虽然SQL标准没有索引相关的语句,但为了查询效率,商用数据库通常提供索引机制和与数据库(有的系统称为目录)相关的语句。**

---

****2. 数据库对象命名机制**:

  • 早期数据库系统:所有数据库对象都属于一个数据库(只有一个命名空间)。
  • 现代关系数据库:提供层次化的数据库对象命名机制。
  • 一个关系数据库系统实例中可建立多个数据库。
  • 一个数据库中可建立多个模式。
  • 一个模式下通常包括多个表、视图、索引等数据库对象。**

**图3.3** 描述了数据库对象命名机制的层次结构,展示了从数据库系统实例到具体的表/视图/索引的层次关系。

---

****本节内容总结**:

  • 了解如何定义模式、基本表和索引。
  • 视图的定义及概念会在3.7节进行专门讨论。**

通过这个笔记,读者可以快速理解和回顾3.3节的核心内容和重点。

3.3.1 模式的定义与删除

**3.3.1 模式的定义与删除**

---

****1. 定义模式**

  • **SQL模式定义语句**:**
php 复制代码
  CREATE SCHEMA <模式名> AUTHORIZATION <用户名>;

如果不指定<模式名>,那么<模式名>默认为<用户名>。

**- **权限要求**:

  • 调用该命令的用户需拥有数据库管理员权限。
  • 或者必须获得数据库管理员授予的`CREATE SCHEMA`权限。**

**- **例子**:

  • **例3.1**: 为用户WANG定义一个学生-课程模式S-T。**
sql 复制代码
  CREATE SCHEMA "S-T" AUTHORIZATION WANG;

- **例3.2**:

sql 复制代码
 CREATE SCHEMA AUTHORIZATION WANG;

此命令未指定模式名,所以默认模式名为用户名WANG。

**- **模式内容**:

  • 定义模式相当于定义了一个命名空间。
  • 在这个空间里,可以进一步定义该模式包含的数据库对象,如基本表、视图、索引等。
  • 这些对象可以通过表3.3中的`CREATE`语句定义。**

**- **进一步的模式定义**:

  • `CREATE SCHEMA`可以接受`CREATE TABLE`, `CREATE VIEW`和`GRANT`子句。
  • 这意味着在创建模式的同时,可以在此模式里创建基本表、视图,并定义授权。
  • 结构为:**
sql 复制代码
   CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句> <视图定义子句> <授权定义子句>];

- **例3.3**:

sql 复制代码
    CREATE SCHEMA TEST AUTHORIZATION ZHANG
    CREATE TABLE TAB1 (
      COL1 SMALLINT,
      COL2 INT,
      COL3 CHAR(20),
      COL4 NUMERIC(10,3),
      COL5 DECIMAL(5,2)
    );

---

****2. 删除模式**

  • **SQL删除模式语句**:**
sql 复制代码
  DROP SCHEMA <模式名> <CASCADE | RESTRICT>;

**- **选择 CASCADE 或 RESTRICT**:

  • **CASCADE**: 删除模式时,同时删除该模式中所有数据库对象。
  • **RESTRICT**: 如果模式中已定义了下属数据库对象(如表、视图等),则拒绝删除操作。只有当该模式中没有任何对象时,才能执行`DROP SCHEMA`。**

**- **例子**:

  • **例3.4**:**
sql 复制代码
    DROP SCHEMA ZHANG CASCADE;

该命令删除了模式ZHANG,同时,表TAB1也被删除了。

---

这个笔记总结了模式的定义与删除的基本操作和相关的SQL命令,使读者能快速回顾和理解3.3.1节的内容。

3.3.2 基本表的定义、删除与修改

**3.3.2 基本表的定义、删除与修改**

---

**1. 定义基本表**

**- **概述**:创建模式后,即构建了一个数据库命名空间。首先要在这个空间中定义的是数据库基本表。

  • **定义语句**:**
sql 复制代码
  CREATE TABLE <表名> (<列名> <数据类型> [列级完整性约束条件], ... , [<表级完整性约束条件>]);

**- **完整性约束条件**:

  • 存入系统的数据字典中。
  • 当操作表数据时,关系数据库管理系统会自动检查该操作是否违反约束。
  • 约束可以定义在列级或表级。涉及多个属性列的需定义在表级。**

- **例子**:

- **例3.5**:定义"学生"表Student

sql 复制代码
  CREATE TABLE Student (
      Sno CHAR(9) PRIMARY KEY, /* Sno是主码 */
      Sname CHAR(20) UNIQUE,  /* Sname取唯一值 */
      Ssex CHAR(2),
      Sage SMALLINT,
      Sdept CHAR(20)
    );

- **例3.6**:定义"课程"表Course

sql 复制代码
   CREATE TABLE Course (
      Cno CHAR(4) PRIMARY KEY,    /* Cno是主码 */
      Cname CHAR(40) NOT NULL,   /* Cname不能取空值 */
      Cpno CHAR(4),              /* 先修课 */
      Credit SMALLINT,
      FOREIGN KEY(Cpno) REFERENCES Course(Cno)  /* Cpno是外码,被参照表是Course,被参照列是Cno */
    );

- **例3.7**:定义学生选课表SC

sql 复制代码
 CREATE TABLE SC (
      Sno CHAR(9),
      Cno CHAR(4),
      Grade SMALLINT,
      PRIMARY KEY (Sno, Cno),   /* 主码由Sno和Cno构成 */
      FOREIGN KEY(Sno) REFERENCES Student(Sno),  /* Sno是外码,被参照表是Student */
      FOREIGN KEY(Cno) REFERENCES Course(Cno)    /* Cno是外码,被参照表是Course */
    );

---

**[注意]**:后续部分关于"删除与修改"的内容似乎被删减了。请提供相关部分的内容,以便为您整理笔记。

**2. 数据类型**

---

关系模型中的**域**是一个核心概念。每个属性都来源于一个特定的域,且其取值必须位于该域之中。在SQL语言中,这个域的概念由**数据类型**实现。定义表的属性时,需要明确其数据类型及长度。尽管SQL标准支持众多数据类型,但不同的关系数据库管理系统(RDBMS)所支持的数据类型可能会有所不同。

**表3.4 常用数据类型及其描述**

---

**选择合适的数据类型**:决定一个属性的数据类型需要考虑其实际应用情境:

1. **取值范围**:需要确认该属性可能的最大和最小值。
2. **所需运算**:考虑该属性会进行哪些运算。例如,年龄属性可能需要算术运算,如计算平均年龄,因此选择整数类型更为合适。

**示例**:考虑年龄属性(Sage)。尽管可以选择CHAR(3)作为数据类型,但由于需要进行算术运算,CHAR类型不适合。考虑到人的年龄大约在百岁以内,选择短整数(SMALLINT)作为其数据类型更为合适。

3.模式与表

**3. 模式与表**

---

在关系数据库中,**模式**是定义数据库结构的一种方式,而**基本表**是模式中的具体结构。每个基本表都属于某一个模式。下面是模式和表的定义及关联方式的简要笔记:

**1. **定义方式**:

  • 每个基本表都属于特定的模式。
  • 一个模式可以包含多个基本表。**

**2. **表所属模式的定义方法**:

  • **方法一**:在表名中明确标明模式名。**
sql 复制代码
    CREATE TABLE "S-T".Student(...);
        CREATE TABLE "S-T".Course(...);
        CREATE TABLE "S-T".SC(...);

**- **方法二**:在创建模式时一并定义表。

  • **方法三**:先设置默认模式,再创建表,这样在定义表时就不需要再明确指定模式名。**

**3. **搜索路径**:

  • 当创建基本表时没有指定模式,系统会根据**搜索路径**确定该表所属的模式。
  • 搜索路径包含一系列模式名,RDBMS会选用其中第一个存在的模式名作为表的模式名。
  • 如果所有搜索路径中的模式名都不存在,系统会报错。
  • 查看当前搜索路径:**
sql 复制代码
 SHOW search_path;

**- 默认搜索路径是 `$user, PUBLIC`。这意味着系统首先会查找与用户名相同的模式,若不存在,再使用`PUBLIC`模式。

  • 数据库管理员可以修改默认搜索路径。例如,为了默认使用"S-T"模式,可以执行以下操作:**
sql 复制代码
  SET search path TO "S-T", PUBLIC;
        CREATE TABLE Student (...);

**总结**:模式为数据库提供了一个组织和管理的结构,而基本表是模式中的具体实体。在实际操作中,可以使用不同的方法来指定表所属的模式,其中最常见的是通过设置搜索路径。

**4. 修改基本表**

---

关系数据库的应用环境和需求可能随时间发生变化,因此经常需要对已存在的基本表进行修改。SQL提供了`ALTER TABLE`语句来实现这些更改。以下是如何修改基本表的详细笔记:

1. **ALTER TABLE语句格式**:

sql 复制代码
   ALTER TABLE <表名>
    [ADD [COLUMN] <新列名> <数据类型> [完整性约束]]
    [ADD <表级完整性约束>]
    [DROP [COLUMN] <列名> [CASCADE | RESTRICT]]
    [DROP CONSTRAINT <完整性约束名> [RESTRICT | CASCADE]]
    [ALTER COLUMN <列名> <数据类型>];

**2. **修改操作的说明**:

  • **ADD子句**:用于添加新的列、新的列级完整性约束条件,以及新的表级完整性约束条件。
  • **DROP COLUMN子句**:删除表中的列。`CASCADE`选项会自动删除引用了该列的其他对象,如视图。`RESTRICT`选项则在该列被其他对象引用时拒绝删除。
  • **DROP CONSTRAINT子句**:删除指定的完整性约束条件。
  • **ALTER COLUMN子句**:修改原有的列定义,这可以是修改列名或数据类型。**

**3. **示例**:

  • **例3.8**:向Student表中添加一个新列"入学时间",数据类型为日期。**
sql 复制代码
   ALTER TABLE Student ADD S_entrance DATE;

**新增的列默认值为空。

  • **例3.9**:将Student表的Sage列数据类型从字符型更改为整数型。**
sql 复制代码
    ALTER TABLE Student ALTER COLUMN Sage INT;

- **例3.10**:在Course表上添加一个约束,确保课程名称(Cname)是唯一的。

sql 复制代码
  ALTER TABLE Course ADD UNIQUE(Cname);

**总结**:`ALTER TABLE`语句为数据库开发者提供了强大的工具,以满足不断变化的应用需求。使用此语句可以添加、删除或修改表结构,从而确保数据结构的灵活性和适应性。

**5. 删除基本表**

---

删除不再需要的基本表是数据库维护的常见任务。`DROP TABLE`语句在SQL中负责执行此操作。以下是此主题的详细笔记:

1. **DROP TABLE语句格式**:

sql 复制代码
  DROP TABLE <表名> [RESTRICT | CASCADE];

**2. **删除操作的说明**:

  • **RESTRICT**:有条件地删除基本表。基本表不应被其他表的约束(如`CHECK`, `FOREIGN KEY`等)、视图、触发器、存储过程或函数等引用。存在这些依赖关系时,表不能被删除。
  • **CASCADE**:无条件地删除基本表。在删除基本表时,所有依赖的对象,如视图,都将一同被删除。
  • 默认行为是`RESTRICT`。**

**3. **示例与注意事项**:

  • **例3.11**:删除`Student`表并级联删除相关对象。**
sql 复制代码
    DROP TABLE Student CASCADE;

**执行此操作时需特别小心,因为删除基本表不仅会删除表中的数据和表的定义,还会删除与其相关的索引、触发器等。如果被其他表引用,那些表可能也会被删除。

  • **例3.12**:如果基本表上有视图,使用`RESTRICT`时不能删除表;使用`CASCADE`时,表和视图都会被删除。**
sql 复制代码
     CREATE VIEW IS_Student AS
        SELECT Sno, Sname, Sage FROM Student WHERE Sdept = 'IS';
        
        DROP TABLE Student RESTRICT;  // Error
        DROP TABLE Student CASCADE;  // Deletes both table and view

**4. **不同数据库产品的处理差异**:

  • 不同的数据库系统在执行`DROP TABLE`操作时的处理策略可能会有所不同。
  • 对比`SQL2011`标准与`Kingbase ES`, `Oracle 12c`, 和`MS SQL Server 2012`:
  • **索引**:删除基本表后,所有三种数据库都会自动删除该表的索引。
  • **视图**:`Oracle 12c`和`SQL Server 2012`在删除基本表后保留视图,但它们将失效。`Kingbase ES`根据是否使用`RESTRICT`或`CASCADE`来决定是否删除视图。
  • **存储过程和函数**:三种数据库产品在删除基本表后都不会删除与之相关的存储过程和函数,但它们将失效。**

5. **总结**:在删除基本表时,需要了解数据库产品的特定行为和处理策略。虽然SQL提供了标准化的语言和指令,但具体的执行和实现可能因数据库系统而异。在进行任何操作之前,建议备份数据库并了解可能的副作用。

总结:

**数据定义:重点、难点、易错点及使用技巧**

---

### 1. 重点:

**- **数据结构定义**:使用`CREATE`语句创建数据库、表、视图、索引等。

  • **数据约束**:理解并应用主键 (`PRIMARY KEY`)、外键 (`FOREIGN KEY`)、唯一约束 (`UNIQUE`)、检查约束 (`CHECK`) 等。
  • **修改结构**:使用`ALTER`语句来更改现有的数据库结构。
  • **删除结构**:使用`DROP`语句删除数据库、表、视图等。**

### 2. 难点:

**- **约束的理解与应用**:如何正确地使用和区分不同的数据约束,特别是外键约束和`ON DELETE`、`ON UPDATE`的级联操作。

  • **规范化**:如何进行数据库设计的规范化以减少数据冗余和避免更新异常。
  • **视图与基本表的关系**:如何处理视图与基本表之间的依赖关系,特别是在修改或删除时。**

### 3. 易错点:

**- **忘记约束**:创建表时忽略某些重要的约束条件,例如唯一约束或非空约束。

  • **数据类型不匹配**:定义列或变量时选择了错误的数据类型。
  • **删除操作**:使用`DROP`或`DELETE`语句时不小心删除了重要的数据或结构。
  • **修改列的属性**:使用`ALTER`语句修改列属性时可能导致数据丢失或类型不匹配。**

### 4. 使用技巧:

**- **逐步设计**:在设计数据库结构时,先从大的框架开始,逐步细化。这样可以确保整体结构的一致性。

  • **经常备份**:在进行任何结构性修改前,如使用`DROP`或`ALTER`语句,务必备份数据。
  • **利用工具**:使用数据库设计工具或ER图工具帮助理解和设计数据库结构。
  • **测试与验证**:在应用更改到生产环境之前,首先在测试环境中进行测试,确保操作没有问题。
  • **文档化**:为数据库设计和每个表、视图、索引等编写详细的文档。这有助于后续的维护和团队协作。
  • **理解SQL标准与特定的数据库差异**:不同的数据库系统在处理某些SQL操作时可能有所不同,所以了解和掌握这些差异是很重要的。**

总的来说,数据定义是数据库设计和维护的基石,需要深入理解并小心操作,避免可能的错误。

相关推荐
gma99932 分钟前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️35 分钟前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98761 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
苏-言1 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
Ljw...1 小时前
索引(MySQL)
数据库·mysql·索引
菠萝咕噜肉i2 小时前
超详细:Redis分布式锁
数据库·redis·分布式·缓存·分布式锁
长风清留扬2 小时前
一篇文章了解何为 “大数据治理“ 理论与实践
大数据·数据库·面试·数据治理
Mephisto.java2 小时前
【大数据学习 | Spark】Spark的改变分区的算子
大数据·elasticsearch·oracle·spark·kafka·memcache
OpsEye2 小时前
MySQL 8.0.40版本自动升级异常的预警提示
数据库·mysql·数据库升级
Ljw...2 小时前
表的增删改查(MySQL)
数据库·后端·mysql·表的增删查改